我只是想计时一段代码。伪代码如下所示:
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
这在 Python 中看起来如何?
更具体地说,我如何获得自午夜以来的滴答数(或者 Python 组织该时间)?
在该time
模块中,有两个计时功能:time
和clock
。time
给你“墙”时间,如果这是你关心的。
但是,python文档说clock
应该用于基准测试。请注意,clock
在不同的系统中表现不同:
clock
进程时开始计数)。# 毫秒窗口 t0=time.clock() 做点什么() t= time.clock() - t0 # t 是经过的墙壁秒数(浮点数)
clock
报告 CPU 时间。现在,这是不同的,并且很可能是您想要的值,因为您的程序几乎不是唯一请求 CPU 时间的进程(即使您没有其他进程,内核也会不时使用 CPU 时间)。因此,这个数字通常小于墙上时间(即 time.time() - t0),在对代码进行基准测试时更有意义:# linux t0=time.clock() 做点什么() t= time.clock() - t0 # t 是经过的 CPU 秒数(浮点数)
除此之外,timeit模块有一个Timer
类,该类应该使用最适合从可用功能进行基准测试的方法。
¹ 除非线程碍事……</p>
² 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()
当您的代码完成时,Timer 会自动打印出运行时间。甜的!如果我想在 Python 解释器中快速调整某些东西,这是最简单的方法。
这是“now”和“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
如果您有首选的格式化方法,或者是否有更简单的方法来完成所有这些,请告诉我!
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
python 中的time 模块使您可以访问 clock() 函数,该函数以秒为单位返回时间作为浮点数。
不同的系统将根据其内部时钟设置(每秒滴答声)具有不同的精度,但通常至少低于 20 毫秒,在某些情况下优于几微秒。
-亚当
如果您有许多要计时的语句,则可以使用以下内容:
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
)。
这是一个最小的收益,但我认为这很方便。