我只是想时间一段代码。 伪代码是这样的:
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
这个怎么样在Python?
更具体地讲,我怎么滴答数自午夜(或Python的却是组织正时)?
我只是想时间一段代码。 伪代码是这样的:
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
这个怎么样在Python?
更具体地讲,我怎么滴答数自午夜(或Python的却是组织正时)?
在time
模块,有两个定时功能: time
和clock
。 time
让你“墙”时,如果这是你关心什么。
然而,蟒蛇文档说clock
应该用于标杆。 需要注意的是clock
的行为在不同的系统不同:
clock
在你的进程)。 # ms windows t0= time.clock() do_something() t= time.clock() - t0 # t is wall seconds elapsed (floating point)
clock
报告的CPU时间。 现在,这是不同的,并且最有可能你想要的值,因为你的程序未落是请求CPU时间的唯一进程(即使你有没有其他进程,内核使用CPU的时间,然后现在)。 所以,这个数字,其通常是大于壁时间smaller¹ - 基准码时(即了time.time()T0),是更有意义: # linux t0= time.clock() do_something() t= time.clock() - t0 # t is CPU seconds elapsed (floating point)
除了所有的timeit模块具有Timer
是应该使用什么是最好的从可用功能的基准类。
¹除非线程碍事...
²的Python≥3.3:有time.perf_counter()
和time.process_time()
perf_counter
正在使用由timeit
模块。
你需要的是time()
函数从time
模块:
import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."
您可以使用timeit模块更多的选择,虽然。
下面是我开始使用最近的解决方案:
class Timer:
def __enter__(self):
self.begin = now()
def __exit__(self, type, value, traceback):
print(format_delta(self.begin, now()))
您可以使用它像这样(你至少需要Python 2.5中):
with Timer():
do_long_code()
当你的代码完成后,计时器会自动打印出的运行时间。 甜! 如果我想快速板凳东西在Python解释器,这是要走的最简单的方法。
而且这里有一个“现在”和“format_delta”一个样本实现,但随意使用您喜欢的时机和格式化方法。
import datetime
def now():
return datetime.datetime.now()
# Prints one of the following formats*:
# 1.58 days
# 2.98 hours
# 9.28 minutes # Not actually added yet, oops.
# 5.60 seconds
# 790 milliseconds
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms.
def format_delta(start,end):
# Time in microseconds
one_day = 86400000000
one_hour = 3600000000
one_second = 1000000
one_millisecond = 1000
delta = end - start
build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day
days = 0
while build_time_us > one_day:
build_time_us -= one_day
days += 1
if days > 0:
time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
else:
hours = 0
while build_time_us > one_hour:
build_time_us -= one_hour
hours += 1
if hours > 0:
time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
else:
seconds = 0
while build_time_us > one_second:
build_time_us -= one_second
seconds += 1
if seconds > 0:
time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
else:
ms = 0
while build_time_us > one_millisecond:
build_time_us -= one_millisecond
ms += 1
time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
return time_str
请让我知道,如果你有一个首选的格式化方法,或者是否有做这一切更简单的方法!
该时间模块在Python,您可以访问时钟()函数,它在几秒钟内返回时间为浮点。
不同的系统会根据它们的内部时钟设置有不同的精度(每秒蜱),但它通常至少在20milliseconds,并在某些情况下比几微秒更好。
-亚当
import datetime
start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds
从午夜:
import datetime
midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
now = datetime.datetime.now()
delta = now - midnight
print delta.seconds
如果你有你想当时许多语句,你可以使用这样的事情:
class Ticker:
def __init__(self):
self.t = clock()
def __call__(self):
dt = clock() - self.t
self.t = clock()
return 1000 * dt
然后,你的代码可能是这样的:
tick = Ticker()
# first command
print('first took {}ms'.format(tick())
# second group of commands
print('second took {}ms'.format(tick())
# third group of commands
print('third took {}ms'.format(tick())
你不需要输入这样t = time()
每个块和之前1000 * (time() - t)
后,同时仍保持控制权的格式(虽然你可以很容易地把在Ticket
太)。
这是一个最小增益,但我认为这是一种方便。