【问题标题】:Measuring the time it takes for a function to run and complete in Python测量一个函数在 Python 中运行和完成所花费的时间
【发布时间】:2014-08-17 16:14:20
【问题描述】:

在 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)

这再次导致了 6.87261802845284E-06,尽管(至少我认为)它应该需要 3 秒。我已经尝试使用线程进行此操作,结果相同。你怎么看?如何衡量一个函数运行和完成需要多长时间?

【问题讨论】:

  • time 模块将不准确,因为它依赖于 cpu(在较高 cpu 使用率时会变慢),请改用 timeit 模块
  • 你使用asyncio.wait_for()而不是直接调用method()的目的是什么?
  • 尝试测量方法完成所用的时间。但它必须测量调用该方法所花费的时间,因为 3 秒的延迟不会花费 0.00000629989986222767E 秒来调用和完成。

标签: python python-3.x


【解决方案1】:

我通常使用这个装饰器来计时我的功能:

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() 将返回自纪元以来经过的秒数(即挂墙时间),这是您所需要的。

或者你也可以使用timeithttps://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。所以这对我来说没有开销。)

    【讨论】:

      【解决方案3】:

      我承认我对 Python 的 asyncio 不是很熟悉,但我相信问题不在于您的时机,而在于您对 asyncio 的使用。

      我认为你只是在用 method() 的值创建一个未来,但这就是你所要把握的时间:这个 promise 的实际创建。

      您没有对未来价值的实际评估进行计时。这就是为什么计时 sleep(3) 和 method() 需要大致相同的时间。

      我建议尝试将asyncio.wait_for((method()), 5) 更改为yield from asyncio.wait_for((method()), 3) 或如果可以的话仅更改timing method()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 2010-12-13
        • 2011-10-10
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        • 2014-05-25
        相关资源
        最近更新 更多