Измерение времени, затрачиваемого на очень маленькие действия, очень неточно, если количество итераций слишком мало. И независимо от того, поддерживает ли оборудование время в микросекундах или наносекундах или нет, вам также необходимо учитывать «накладные расходы» "от машины, выполняющей другие действия.
Что-то не хватает в моем коде или есть ошибка в библиотеке?
Если общее количество циклов слишком велико маленький и без реального наносекундного разрешения, вы, вероятно, получите 0, потому что весь l oop выполняется менее чем за 1 миллисекунду (1000 микросекунд, 1000000 нс), поэтому 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 нс.
Также накладные расходы на actall y работает l oop, что трудно удалить из математики.
Или в I Python:
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
Увеличьте это до 100 миллионов, и я получу 64 нс. Но есть «l oop overhead», поэтому используйте timeit
, либо для вызова гаммы, либо из командной строки.
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