Модуль time — низкоуровневая работа со временем

Модуль time — это тонкий слой над функциями операционной системы для работы со временем. Если datetime — про «человеческие» даты, то time — про секунды, таймеры, паузы и Unix-время.

import time

Когда использовать time, а не datetime

  • Измерить, сколько секунд работает кусок кодаtime.

  • Подождать N секундtime.

  • Получить Unix-timestamptime.

  • Работать с календарной датойdatetime.

  • Часовые пояса, форматирование, арифметика датdatetime.


Unix-время: time.time()

Возвращает количество секунд (с дробной частью) с 1 января 1970 года 00:00 UTC.

import time

print(time.time())
# 1778843025.123456

Используется как метка времени, как primary key, для измерений длительностей, для генерации уникальных имён файлов.

Чтобы перевести Unix-время в обычную дату:

from datetime import datetime, timezone
import time

ts = time.time()
print(datetime.fromtimestamp(ts))                       # локальное
print(datetime.fromtimestamp(ts, tz=timezone.utc))      # UTC

Пауза: time.sleep(seconds)

Приостанавливает выполнение на указанное число секунд. Принимает float — можно ждать дробные секунды.

import time

print('Начало')
time.sleep(2.5)        # пауза 2.5 секунды
print('Прошло 2.5 с')

Самые частые применения:

  • подождать ответа от внешнего сервиса;

  • сделать паузу между запросами к API (избежать rate-limit);

  • визуальная задержка в учебных программах и играх.

Предупреждение

time.sleep блокирует поток. В асинхронном коде используйте await asyncio.sleep(...), иначе подвесите весь event loop.


Измерение времени выполнения

Для бенчмарков используют не time.time(), а time.perf_counter(). Он точнее и не «прыгает» при переводе системных часов.

import time

start = time.perf_counter()

# ... код, который измеряем ...
total = sum(i*i for i in range(10**6))

elapsed = time.perf_counter() - start
print(f'Выполнено за {elapsed:.4f} с')

Чтобы измерить процессорное время (без учёта sleep, ожидания I/O) — time.process_time().

функция                  что измеряет             когда брать
------                   ------------             ----------
time.time()              wall-clock UTC           timestamps
time.perf_counter()      монотонный счётчик       бенчмарки длительности
time.monotonic()         монотонный счётчик       таймеры, deadline
time.process_time()      CPU-время процесса       профилирование вычислений

Декоратор-таймер

Удобно сделать декоратор для замера любых функций:

import time
from functools import wraps

def timed(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        print(f'{func.__name__} -> {time.perf_counter() - start:.4f} с')
        return result
    return wrapper

@timed
def slow():
    total = 0
    for i in range(10**6):
        total += i
    return total

slow()
# slow -> 0.0623 с

Структурированное время: struct_time

Старый API модуля time. time.localtime() и time.gmtime() возвращают именованный кортеж struct_time:

import time

t = time.localtime()
print(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour)
# 2026 5 14 10

Форматирование и парсинг — через time.strftime и time.strptime (аналогично datetime):

import time

print(time.strftime('%Y-%m-%d %H:%M:%S'))
# 2026-05-14 10:30:45

В новых программах удобнее datetime. struct_time остаётся в основном для совместимости.


Практический пример: rate-limit для API

Не больше одного запроса в секунду:

import time

def make_rate_limiter(min_interval):
    last_call = 0.0

    def wait():
        nonlocal last_call
        now = time.monotonic()
        sleep_for = min_interval - (now - last_call)
        if sleep_for > 0:
            time.sleep(sleep_for)
        last_call = time.monotonic()

    return wait

throttle = make_rate_limiter(1.0)

for url in urls:
    throttle()
    fetch(url)

Для таймеров берём monotonic — он гарантированно не идёт назад, даже если кто-то перевёл системные часы.


Практический пример: повтор с задержкой

import time

def retry(func, attempts=5, delay=1.0, backoff=2.0):
    for attempt in range(attempts):
        try:
            return func()
        except Exception as e:
            if attempt == attempts - 1:
                raise
            print(f'Попытка {attempt+1} не удалась: {e}. Жду {delay} с')
            time.sleep(delay)
            delay *= backoff

Это классический паттерн «exponential backoff» — задержка увеличивается с каждой неудачей.


Подводные камни

Предупреждение

  • ``time.time()`` может идти назад. Например, при NTP-синхронизации. Для длительностей используйте time.monotonic() или time.perf_counter().

  • ``time.sleep`` блокирует поток. В async-коде используйте asyncio.sleep. В GUI — таймеры фреймворка, иначе подвиснет интерфейс.

  • Точность ``sleep`` ограничена ОС. На Windows минимальная задержка часто ~15 мс, даже если попросили sleep(0.001).

  • Timezone и timestamp. time.time() всегда даёт UTC-секунды. time.localtime() уже учитывает локаль и пояс ОС — это часто источник багов на серверах с неправильной TZ.


Смотрите также


Примечание

Лицензия и источники

Часть материала адаптирована из официальной документации Python (https://docs.python.org/3/library/time.html), доступной под Python Software Foundation License Version 2 (PSF License). Адаптация, переработка, оригинальные примеры и пояснения — © AlashEd Wiki.