Чем отличаются time.time() и time.monotonic() в Python и когда их использовать

Ответ

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

time.time()

  • Что делает: Возвращает системное "wall-clock" время (реальное время) в секундах с начала Эпохи Unix (00:00:00 UTC 1 января 1970 г.).
  • Особенность: Это время не является монотонным. Оно может "прыгать" вперед или назад из-за синхронизации системных часов по сети (NTP) или ручного перевода времени пользователем.
  • Когда использовать: Для получения абсолютной временной метки, которую нужно сохранить, отобразить пользователю или синхронизировать с другими системами.

time.monotonic()

  • Что делает: Возвращает значение монотонно возрастающих часов. Его начальная точка не определена, поэтому абсолютное значение само по себе не имеет смысла.
  • Особенность: Гарантированно никогда не уменьшается. Идеально подходит для измерения временных интервалов.
  • Когда использовать: Для измерения длительности операций: вычисления таймаутов, бенчмарков, оценки производительности кода.

Практический пример:

import time

start_real = time.time()
start_mono = time.monotonic()

print("Выполняем операцию...")
# Представим, что во время sleep системное время было скорректировано назад на 5 секунд
time.sleep(2)

end_real = time.time()
end_mono = time.monotonic()

# Этот результат может быть неверным (например, отрицательным) при смене системного времени
print(f"time.time() интервал: {end_real - start_real:.2f} сек.")

# Этот результат всегда будет корректным
print(f"time.monotonic() интервал: {end_mono - start_mono:.2f} сек.")

Ключевое правило: Используйте time.time() для ответа на вопрос "Который час?", а time.monotonic() для ответа на вопрос "Сколько времени прошло?".

Ответ 18+ 🔞

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

time.time()

  • Задача у неё какая? Сказать тебе, сколько секунд нахуй прошло с той самой ночи, когда все начали считать время — с 1 января 1970 года, ноль часов по Гринвичу. Это твои системные часы на стене.
  • Подвох в чём? Эти часы — ненадёжная сука. Их может администратор перевести, или интернет их подкрутит (NTP), и они возьмут и прыгнут назад. Или вперёд. Абсолютно нихуя не монотонно.
  • Когда её трогать? Когда тебе нужно узнать, который сейчас час. Сохранить дату в лог, показать пользователю, отправить на сервер — вот это всё.

time.monotonic()

  • А эта штука что делает? Она считает секунды от какой-то своей, ебёной, непонятной точки. Само число — хуйня, полная. Смысла в нём ноль.
  • Зато какая фишка? Оно гарантированно ползёт только вверх. Никаких прыжков назад, даже если системные часы сломались в говно. Идеально, чтобы мерить промежутки.
  • Когда её юзать? Когда тебе нужно померить, сколько времени что-то длилось. Таймауты, бенчмарки, засечь, как долго код выполняется — вот её царство.

Простой пример, чтобы въебать в мозг:

import time

# Засекаем старт по обоим часам
start_real = time.time()
start_mono = time.monotonic()

print("Делаем вид, что что-то считаем...")
# Допустим, прямо пока мы спали, время в системе перевели на 5 секунд назад
time.sleep(2)

# Фиксируем конец
end_real = time.time()
end_mono = time.monotonic()

# Вот эта разница может оказаться пиздец какой — хоть отрицательной!
print(f"По time.time() прошло: {end_real - start_real:.2f} сек.")

# А вот эта — всегда будет честной, ебать её в сраку
print(f"По time.monotonic() прошло: {end_mono - start_mono:.2f} сек.")

Итоговое правило, которое надо выжечь на подкорке:
time.time() — это когда тебе нужно узнать время.
time.monotonic() — это когда тебе нужно померить промежуток.
Всё, иди работай, а то сидишь тут, ебушки-воробушки.