Python time_ns时差在低于 1000 秒(10^6 ns)时给出 0

  • 本文关键字:ns 时差 time 1000 Python python time
  • 更新时间 :
  • 英文 :


这是一个简单的代码(仅用于测试目的(,它只是测量计算数字伽玛所需的时间:

from math import gamma
from time import time_ns
start = time_ns()
x = 0.0
for i in range(1, 1564):
x = gamma(6.31)
taken = time_ns() - start
print("Time taken for calculating gamma is", taken, "ns")
# Time taken for calculating gamma is 1000600 ns
print(x)

一旦我在范围函数调用中将 1563 作为上限,即少一次迭代,输出就变成了

Time taken for calculating gamma is 0 ns

我的代码中是否缺少某些内容或库中是否存在错误?

如果迭代次数太少,则测量非常小的操作所花费的时间是非常不准确的。无论硬件是否支持以微秒或纳秒为单位的时间,您还需要考虑机器执行其他操作的"开销"。

我的代码中是否缺少某些内容或库中是否存在错误?

如果循环总数太小且没有实际纳秒分辨率,则可能为 0,因为整个循环在 1 毫秒(1000 微秒,1000000 ns(内执行,因此time_ns() - start会给出 0。

您的所花费时间数学应包括除以迭代次数,以便获得每次迭代的时间。

loops = 1564
start = time_ns()
for i in range(1, loops+1):
x = gamma(6.31)
taken = time_ns() - start
print("Time taken for calculating gamma is", taken/loops, "ns")  # divide by # of loops
# 9597.504798464492 ns

但是,如果我将循环次数增加到 10,000,000,我会得到更准确的读数:

>>> loops = 10_000_000
>>> start = time_ns()
>>> for i in range(1, loops+1):
...     x = gamma(6.31)
...
>>> taken = time_ns() - start
>>>
>>> print("Time taken for calculating gamma is", taken/loops, "ns")
Time taken for calculating gamma is 389.52228 ns

重复几次会给我一个 385 到 395 ns 之间的答案。

还有实际运行循环的开销,这很难从数学中删除。

或者在IPython中:

In [6]: %timeit x = gamma(6.31)
371 ns ± 2.11 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

如果您尝试测量循环太少的1 + 1速度,则会遇到同样的问题:

loops = 10
start = time_ns()
for i in range(1, loops+1):
x = 1 + 1
taken = time_ns() - start
taken / loops
# gives 0.0

将其增加到 1 亿,我得到 64 ns。但是有"循环开销",所以使用timeit调用 gamma 或从命令行。

C:Users...>python -m timeit "1+1"
20000000 loops, best of 5: 10.4 nsec per loop
C:Users...>python -m timeit -s "from math import gamma" "gamma(6.31)"
1000000 loops, best of 5: 323 nsec per loop

最新更新