在Python中获取计时器滴答
我只是想要一段代码。 伪代码看起来像:
start = get_ticks() do_long_code() print "It took " + (get_ticks() - start) + " seconds."
这在Python中看起来如何?
更具体地说,我如何获得自午夜以来的蜱数量(或者Python组织这个时间)?
在time
模块中,有两个定时function: time
和clock
。 time
给了你“墙”的时间,如果这是你所关心的。
然而,python 文档说clock
应该用于基准testing。 请注意, clock
在不同的系统中performance不同:
- 在MS Windows上,它使用Win32函数QueryPerformanceCounter(),“分辨率通常优于微秒”。 它没有什么特别的含义,只是一个数字(在你第一次在你的程序中调用
clock
时开始计数)。
#ms窗口 t0 = time.clock() 做一点事() t = time.clock() - t0#t是墙壁秒数(浮点数)
- 在* nix上,
clock
报告CPU时间。 现在,这是不同的,也许是你想要的价值,因为你的程序几乎不是唯一的请求CPU时间的进程(即使你没有其他进程,内核现在使用CPU时间)。 因此,这个数字通常比wall时间(即time.time() – t0)小1¹在基准代码时更有意义:
#linux t0 = time.clock() 做一点事() t = time.clock() - t0#t是经过的CPU秒数(浮点数)
除此之外, timeit模块还有Timer
类,它应该使用最适合从可用function进行基准testing的Timer
类。
¹除非线程妨碍…
²Python≥3.3:有time.perf_counter()
和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模块来获得更多的select。
这是我最近开始使用的解决scheme:
class Timer: def __enter__(self): self.begin = now() def __exit__(self, type, value, traceback): print(format_delta(self.begin, now()))
你这样使用它(你至less需要Python 2.5):
with Timer(): do_long_code()
当你的代码完成时,Timer会自动打印出运行时间。 甜! 如果我想在Python解释器中快速安装某些东西,这是最简单的方法。
下面是'now'和'format_delta'的示例实现,尽pipe可以随意使用您的首选时间和格式化方法。
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中的时间模块可以访问clock()函数,该函数以秒为单位返回浮点数。
不同的系统根据其内部时钟设置(每秒钟滴答数)会有不同的准确度,但通常至less低于20毫秒,在某些情况下优于几微秒。
-亚当
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())
这样,你不需要在每个块之前inputt = time()
,在它之后input1000 * (time() - t)
,同时仍然保持对格式的控制(尽pipe你可以很容易地把它放在Ticket
)。
这是一个微不足道的收获,但我觉得这样很方便。