在Python中获取计时器滴答

我只是想要一段代码。 伪代码看起来像:

start = get_ticks() do_long_code() print "It took " + (get_ticks() - start) + " seconds." 

这在Python中看起来如何?

更具体地说,我如何获得自午夜以来的蜱数量(或者Python组织这个时间)?

time模块中,有两个定时function: timeclocktime给了你“墙”的时间,如果这是你所关心的。

然而,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_countertimeit模块使用。

你需要的是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 )。

这是一个微不足道的收获,但我觉得这样很方便。