准确测量python函数所需的时间

时间:2009-11-06 03:25:04

标签: python time profiling timeit

我需要测量程序某些部分的时间(不是用于调试,而是作为输出中的一项功能)。准确性很重要,因为总时间只有几分之一秒。

当我遇到time module时,我打算使用timeit,声称​​避免了一些用于衡量执行时间的常见陷阱。不幸的是,它有一个糟糕的接口,将一个字符串作为输入然后进行评估。

那么,我是否需要使用此模块准确地测量时间,或者时间是否足够?它指的是什么陷阱?

由于

7 个答案:

答案 0 :(得分:28)

您可以构建一个时序上下文(请参阅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()    

答案 1 :(得分:27)

根据Python documentation,它与不同操作系统中时间函数的准确性有关:

  

默认计时器功能是平台   依赖。在Windows上,time.clock()   有微秒粒度但是   time.time()的粒度是1/60   一秒;在Unix上,time.clock()有   1/100的第二个粒度和   time.time()更精确。上   平台,默认计时器   功能测量挂钟时间,而不是   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不包括睡眠时间。

答案 2 :(得分:8)

timeit模块看起来像是为了进行算法的性能测试,而不是简单的应用程序监视。您最好的选择可能是使用时间模块,在您感兴趣的段的开头和结尾处调用time.time(),然后减去这两个数字。请注意,您获得的数字可能比系统计时器的实际分辨率多得多。

答案 3 :(得分:4)

您是否查看了功能提供的配置文件或cProfile?

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

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

答案 4 :(得分:4)

我对timeit的可怕界面感到恼火,所以我为此制作了一个库,请查看它的使用琐碎


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

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:2)

从Python 2.6 on timeit不再局限于输入字符串。引用the documentation

  

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