【问题标题】:Python most accurate method to measure time (ms)Python最准确的时间测量方法(毫秒)
【发布时间】:2020-01-22 05:54:38
【问题描述】:

我需要测量我的代码的某些部分所花费的时间。在强大的服务器上执行我的代码时,我得到了 10 个不同的结果

我尝试比较用time.time()time.perf_counter()time.perf_counter_ns()time.process_time()time.process_time_ns() 测量的时间。

import time

for _ in range(10):
    start = time.perf_counter()
    i = 0
    while i < 100000:
        i = i + 1
    time.sleep(1)
    end = time.perf_counter()
    print(end - start)

我希望在执行相同的代码 10 次时,结果相同(结果的分辨率至少为 1 毫秒)例如。 1.041XX 而不是 1.030 秒 - 1.046 秒。

When executing my code on a 16 cpu, 32gb memory server I'm receiving this result:

1.045549364
1.030857833
1.0466020120000001
1.0309665050000003
1.0464690349999994
1.046397238
1.0309525370000001
1.0312070380000007
1.0307592159999999
1.046095523

Im expacting the result to be: 

1.041549364
1.041857833
1.0416020120000001
1.0419665050000003
1.0414690349999994
1.041397238
1.0419525370000001
1.0412070380000007
1.0417592159999999
1.041095523

【问题讨论】:

  • @PatrickArtner 我不是在寻找平均时间,我只是在计算相同的时间,当我执行相同的代码部分以与上次迭代相同时。我不明白为什么有时会花更多的时间,有时会花更少的时间。
  • 查看我的回答和 sleep() 的文档

标签: python python-3.x time


【解决方案1】:

你的期望是错误的。如果要测量代码平均时间消耗,请使用 timeit 模块。它会多次执行您的代码,并在一段时间内取平均值。

你的代码有不同的运行时的原因在于你的代码:

time.sleep(1)  # ensures (3.5+) _at least_ 1000ms are waited, won't be less, might be more

你在一个紧密的循环中调用它,导致累积差异:

引用time.sleep(..) documentation:

在给定的秒数内暂停执行调用线程。该参数可以是一个浮点数,以指示更精确的睡眠时间。实际的暂停时间可能小于请求的时间,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长任意数量。

在 3.5 版中更改:该函数现在睡眠至少几秒,即使睡眠被信号中断,除非信号处理程序引发异常(有关基本原理,请参阅 PEP 475)。

强调我的。

【讨论】:

  • 是的,time.sleep 肯定是问题所在,所以我需要找到更准确的方法来暂停我的代码,谢谢 :)
【解决方案2】:

由于系统的调度,在每次循环迭代中执行代码不会花费相同的时间(系统会暂停您的进程以执行另一个进程,然后再返回...)。

【讨论】:

  • 要了解这一点,请在您的 PC 上查看进程管理器(top commmand 如果您在 Unix 上),您会看到您启​​动了很多进程但可用内核较少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
相关资源
最近更新 更多