Python разница во времени time_ns дает 0, когда меньше 1 милли (10 ^ 6 нс) - PullRequest
0 голосов
/ 18 июня 2020

Вот простой код (только для целей тестирования), который просто измеряет время, затрачиваемое на вычисление гаммы числа:

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

Что-то не хватает в моем коде или в библиотеке есть ошибка?

1 Ответ

0 голосов
/ 18 июня 2020

Измерение времени, затрачиваемого на очень маленькие действия, очень неточно, если количество итераций слишком мало. И независимо от того, поддерживает ли оборудование время в микросекундах или наносекундах или нет, вам также необходимо учитывать «накладные расходы» "от машины, выполняющей другие действия.

Что-то не хватает в моем коде или есть ошибка в библиотеке?

Если общее количество циклов слишком велико маленький и без реального наносекундного разрешения, вы, вероятно, получите 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...