Измерение длинных временных интервалов в python - PullRequest
0 голосов
/ 26 марта 2020

После поиска различных способов измерения времени в Python 3.x я решил использовать функцию perf_counter () из модуля time . Когда я тестировал его с помощью функции, для запуска которой потребовалось несколько секунд, она работала нормально, но код, из которого я хочу извлечь результаты синхронизации, занимает десятки часов.

Сегодня я получил результаты и, к моему удивлению, время результаты были в порядке долей секунд, что является абсурдом. Поэтому я пришел спросить вас, почему это происходит, и как точно измерить длительные интервалы времени в Python 3.x.

Используемый код выглядит следующим образом:

optimization_times = []
for i in range(30):
    # Search parameters on train set
    print("Round %d" % i)
    time_start = time.perf_counter()
    solution = metaheuristic.optimize()
    time_end = time.perf_counter()
    # Keep time spent
    optimization_times.append(time_end - time_start)

Эксплуатация система: Ubuntu 18.04

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Вы видели циклический переход.

Из документов :

... часы с самым высоким доступным разрешением для измерения короткий длительность.

Если ваш интервал составляет десятки часов, вам следует придерживаться time.time(), он имеет достаточное разрешение для ваших нужд.

Если вы думаете, вам действительно нужно безумное количество цифр точности, затем объедините time.time () с perf_counter (), а также чтобы программа на стороне периодически записывала оба значения, чтобы вы могли синхронизировать c смещение perf_counter с глобальным временем. Такой журнал соответствует тому, что ваш 48-битный счетчик стал на несколько бит шире, он позволяет наблюдать за каждым событием циклического изменения.

0 голосов
/ 26 марта 2020

time.perf_counter() → float

Возвращает значение ( в долях секунды ) счетчика производительности, то есть часов с самым высоким доступным разрешением измерить короткую продолжительность. Он включает время, прошедшее во время сна, и является общесистемным. Контрольная точка возвращаемого значения не определена, поэтому допустима только разница между результатами последовательных вызовов.

-

"что такое дробная секунда? "

Дробная секунда - это часть времени, которая не является целым числом. Так что если у вас есть время, например 12345678,9, то дробная секунда равна 0,9

(Базилик Старынкевич)


Возможное решение: timeit:

import timeit
import time

def func():
    time.sleep(0.05)

timeit.timeit(lambda: func(), number=10)

Выходы:

0.528169795999986
...