准确地测量python函数占用的时间

我需要测量程序的某些部分的时间(不是用于debugging,而是作为输出中的一个function)。 精确度很重要,因为总时间只有一秒钟的几分之一。

当我遇到timeit时,我将使用时间模块 ,它声称避免了一些测量执行时间的常见陷阱 。 不幸的是,它有一个糟糕的界面,把一个string作为input,然后eval的。

那么,我是否需要使用这个模块来准确地测量时间,还是将时间足够? 它指的是什么陷阱?

谢谢

根据Python 文档,它与不同操作系统中的时间函数的精度有关:

默认的定时器function是平台相关的。 在Windows上,time.clock()的粒度是微秒,但time.time()的粒度是1/60秒。 在Unix上,time.clock()具有1/100秒的粒度,而time.time()更精确。 在任一平台上,默认的定时器function都是测量挂钟时间,而不是CPU时间。 这意味着运行在同一台计算机上的其他进程可能会干扰计时…在Unix上,可以使用time.clock()来测量CPU时间。

timeit.py的代码直接拉:

 if sys.platform == "win32": # On Windows, the best timer is time.clock() default_timer = time.clock else: # On most other platforms the best timer is time.time() default_timer = time.time 

此外,它直接处理为您设置运行时代码。 如果你使用时间,你必须自己做。 这当然可以节省您的时间

Timeit的设置:

 def inner(_it, _timer): #Your setup code %(setup)s _t0 = _timer() for _i in _it: #The code you want to time %(stmt)s _t1 = _timer() return _t1 - _t0 

编辑,只有Python 3:

从Python 3.3开始,您可以使用time.perf_counter() (系统范围的时间)或time.process_time() (过程范围的时间),就像使用time.clock()

 from time import process_time t = process_time() #do some stuff elapsed_time = process_time() - t 

新的函数process_time将不包括睡眠时间。

你可以build立一个时间上下文(见PEP 343 )来很容易地测量代码块。

 from __future__ import with_statement import time class Timer(object): def __enter__(self): self.__start = time.time() def __exit__(self, type, value, traceback): # Error handling here self.__finish = time.time() def duration_in_seconds(self): return self.__finish - self.__start timer = Timer() with timer: # Whatever you want to measure goes here time.sleep(2) print timer.duration_in_seconds() 

timeit模块看起来像是devise用于执行algorithm的性能testing,而不是简单地监视应用程序。 你最好的select是使用时间模块,在你感兴趣的段的开始和结束处调用time.time() ,然后减去这两个数字。 请注意,您获得的数字可能比系统计时器的实际分辨率还要多得多。

你有没有审查function提供的configuration文件或cProfile?

http://docs.python.org/library/profile.html

这提供了比打印函数调用之前和之后的时间更详细的信息。 也许值得一看…

我也因时间的可怕接口而烦恼,所以我为此做了一个图书馆,检查它的微不足道的使用

 from pythonbenchmark import compare, measure import time a,b,c,d,e = 10,10,10,10,10 something = [a,b,c,d,e] def myFunction(something): time.sleep(0.4) def myOptimizedFunction(something): time.sleep(0.2) # comparing test compare(myFunction, myOptimizedFunction, 10, input) # without input compare(myFunction, myOptimizedFunction, 100) 

https://github.com/Karlheinzniebuhr/pythonbenchmark

文档还提到time.clock()和time.time()根据平台具有不同的分辨率。 在Unix上,time.clock()测量CPU时间,而不是挂钟时间。

timeit还会在运行testing时禁用垃圾收集,这可能不是您想要的生产代码。

我发现time.time()足以满足大多数目的。

从Python 2.6开始,不再限制inputstring。 引用文档 :

在版本2.6中更改:stmt和setup参数现在也可以使用无参数可调用的对象。 这将在一个定时器函数中embedded对它们的调用,然后由timeit()执行。 请注意,由于额外的函数调用,在这种情况下计时开销稍大。