44

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

当我遇到timeit时,我打算使用time 模块,它声称可以避免一些用于测量执行时间的常见陷阱。不幸的是,它有一个糟糕的界面,将一个字符串作为输入,然后进行 eval。

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

谢谢

4

7 回答 7

34

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

默认计时器功能取决于平台。在 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

此外,它还直接为您设置运行时代码。如果你使用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

蟒蛇 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将不包括睡眠期间经过的时间。

Python 3.7+:

从 Python 3.7 开始,您还可以使用process_time_ns()类似于process_time()但返回以纳秒为单位的时间。

于 2009-11-06T03:36:26.540 回答
29

您可以构建一个时序上下文(参见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()    
于 2009-11-06T04:05:56.197 回答
8

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

于 2009-11-06T03:31:59.137 回答
5

我也对 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

于 2015-05-04T17:10:34.823 回答
4

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

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

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

于 2009-11-06T03:50:22.330 回答
3

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

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

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

于 2009-11-06T03:37:25.083 回答
2

从 Python 2.6 开始,timeit 不再局限于输入字符串。引用文档

在 2.6 版更改: stmt 和 setup 参数现在也可以采用无需参数即可调用的对象。这会将对它们的调用嵌入到计时器函数中,然后由 timeit() 执行。请注意,在这种情况下,由于额外的函数调用,时间开销会稍大一些。

于 2013-02-08T17:43:53.077 回答