Python Programming

Мастерство работы с таймерами Python: руководство по time.time(), time.process_time(), time.perf_counter() и time.monotonic()

Spread the love

Содержание

Модуль time в Python предоставляет несколько функций для измерения прошедшего времени, каждая со своими сильными и слабыми сторонами. Оптимальный выбор зависит от конкретного приложения и требуемой точности. Эта статья разъясняет различия между четырьмя ключевыми функциями таймера: time.time(), time.process_time(), time.perf_counter() и time.monotonic().

Использование time.time()

time.time() возвращает текущее системное время в виде числа с плавающей точкой, представляющего секунды с момента эпохи (обычно 1 января 1970 года, 00:00:00 UTC). Это время «стенных часов», подверженное изменениям из-за корректировки системных часов (например, синхронизация NTP). Следовательно, оно не подходит для точных измерений времени.


import time

start_time = time.time()
# ... некоторый код для измерения времени ...
end_time = time.time()
elapsed_time = end_time - start_time
print(f"Прошло времени: {elapsed_time:.4f} секунд")
  

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

Использование time.process_time()

time.process_time() измеряет сумму системного и пользовательского времени ЦП текущего процесса, за исключением времени, потраченного на ожидание или ввод-вывод. Это идеально подходит для оценки производительности операций, связанных с ЦП, обеспечивая надежное измерение потребляемого времени ЦП. Оно не зависит от изменений системных часов и не представляет время «стенных часов».


import time

start_time = time.process_time()
# ... некоторый код, связанный с ЦП ...
end_time = time.process_time()
elapsed_time = end_time - start_time
print(f"Прошло времени процесса: {elapsed_time:.4f} секунд")
  

Эта функция лучше всего подходит для оценки вычислительных затрат программы независимо от внешних факторов.

Использование time.perf_counter()

time.perf_counter() предоставляет значение счетчика производительности с высоким разрешением и максимально возможной точностью. Это идеально подходит для оценки производительности кода, где точность имеет первостепенное значение. Как и time.process_time(), оно не зависит от изменений системных часов, но в отличие от time.process_time(), оно включает время, потраченное на ожидание.


import time

start_time = time.perf_counter()
# ... некоторый код для точного измерения времени ...
end_time = time.perf_counter()
elapsed_time = end_time - start_time
print(f"Прошло времени по счетчику производительности: {elapsed_time:.6f} секунд")
  

Используйте time.perf_counter() для микро-бенчмаркинга и приложений, требующих чрезвычайно точных измерений времени, независимо от изменений системных часов.

Использование time.monotonic()

time.monotonic() возвращает монотонно возрастающее значение счетчика. Значение всегда увеличивается и никогда не уменьшается, даже при корректировке системных часов. Это важно для измерения прошедшего времени, когда гарантированно монотонно возрастающее значение времени имеет решающее значение, независимо от внешних воздействий. Оно не напрямую связано со временем «стенных часов» или временем ЦП.


import time

start_time = time.monotonic()
# ... некоторый код ...
end_time = time.monotonic()
elapsed_time = end_time - start_time
print(f"Прошло монотонного времени: {elapsed_time:.4f} секунд")
  

Эта функция необходима в сценариях, когда корректировка часов может привести к неточным измерениям времени, например, в игровых циклах или индикаторах выполнения.

В заключение, выбор подходящей функции таймера полностью зависит от потребностей конкретного приложения. Для общего измерения времени может быть достаточно time.time(). Для задач, связанных с ЦП, рекомендуется time.process_time(). Для высокоточных измерений идеально подходит time.perf_counter(). Наконец, time.monotonic() гарантирует монотонно возрастающие значения времени, что важно, когда корректировка часов вызывает опасения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *