用Python测量函数运行和完成所需的时间

6

在Python 3.4.1中,我想要测量一个函数的运行时间并记录下来。我目前是这样做的:

starttime = time.clock()
asyncio.wait_for((method()), 5)
endtime = time.clock()
print(endtime - starttime)

这通常会导致 Python 输出大约 6.29989986222767E-06 (或 0.00000629989986222767E)。然后我尝试使用 time.sleep:

starttime = time.clock()
asyncio.wait_for((time.sleep(3)), 5)
endtime = time.clock()
print(endtime - starttime)

尽管(至少我认为)应该需要3秒钟,但这导致了6.87261802845284E-06的结果。我已经使用线程尝试过这个问题,但结果相同。你怎么看?如何测量函数运行和完成所需的时间?


time 模块会因为依赖于 CPU(在 CPU 使用率较高时会变慢)而不准确,建议使用 timeit 模块。 - wnnmaw
使用 timeit 模块 https://docs.python.org/2/library/timeit.html - Padraic Cunningham
你使用 asyncio.wait_for() 的目的是什么,而不是直接调用 method() - Robᵩ
尝试并测量方法完成所需的时间。但必须测量调用该方法所需的时间,因为3秒延迟不需要0.00000629989986222767E秒来调用并完成。 - Xanco
3个回答

2

我通常使用这个装饰器来计时我的函数:

import time                                                
def timeit(method):
    def timed(*args, **kw):
        ts = time.time()
        result = method(*args, **kw)
        te = time.time()
        print '%r (%r, %r) %2.2f sec' % \
              (method.__name__, args, kw, te-ts)
        return result

    return timed

@timeit
def timeme():
    time.sleep(3)

time.time()提供比time.clock()更精确的基准测试时间,主要是因为time.clock()测量的是CPU时间。time.time()将返回自纪元以来经过的秒数(即墙上时间),这正是您需要的。

或者您也可以使用timeit https://docs.python.org/3/library/timeit.html


2

为了进行快速的性能分析,我使用以下两行代码(加上导入):

import time
import numpy as np

t = time.time()
# ...
print np.round_(time.time() - t, 3), 'sec elapsed'

这很简短、简单,而且通常我所需要的全部。

(在大多数情况下,我已经导入了 numpy。因此对我来说没有额外开销。)


1
我承认我对Python的asyncio不是很熟悉,但我认为问题不在于你的时间设置,而在于你对asyncio的使用。
我认为你只是创建了一个具有方法()返回值的future,但这就是你计时的全部内容:这个promise的实际创建。
你没有计时future值的实际评估。这就是为什么定时sleep(3)和method()花费大致相同的时间。
我建议尝试将asyncio.wait_for((method()), 5)更改为yield from asyncio.wait_for((method()), 3)或者直接用timing method()代替。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接