Работа с модулем time: секунды, паузы и формат времени

Раздел: Основы Python -> Стандартные библиотеки

Основы работы с библиотекой time в Python

Библиотека time предоставляет функции для работы с системным временем, замерами интервалов, паузами и форматированием дат. Ее используют в скриптах для задержек, профилирования, генерации временных меток и синхронизации.

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

Основное решение - использовать time.perf_counter(). Она возвращает монотонное время с максимально доступной точностью (включая наносекунды) и не зависит от перевода часов.

import time
start = time.perf_counter()
# какой-то код
time.sleep(1.5)
end = time.perf_counter()
print(f'Затрачено: {end - start:.6f} сек')

библиотека время python (библиотека time в python)

Затрачено: 1.500123 сек

какие библиотеки нужны для python (библиотеки и модули python)

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

Проблема: time.time() может дать отрицательную разницу при переводе часов назад.

Решение: всегда применять time.perf_counter() или time.monotonic() для интервалов.

Как приостановить выполнение на заданное количество секунд?

Функция time.sleep(seconds) приостанавливает поток на указанное число секунд (допускает дробные значения).

import time
print('Начало')
time.sleep(2.5)
print('Прошло 2.5 сек')

Ошибка: при передаче отрицательного числа возникает ValueError.

Решение: проверять аргумент на положительность или использовать max(0, delay).

Как получить текущую временную метку в секундах?

time.time() возвращает число секунд с эпохи (1 января 1970 UTC).

import time
print(time.time())  # 1698765432.123456

Это значение часто используют для логов.

Как преобразовать временную метку в читаемую строку?

Функция time.ctime(seconds) возвращает строку вида 'Mon Oct 31 12:30:45 2023'. Если аргумент не указан, используется текущий момент.

import time
print(time.ctime())  # 'Mon Oct 31 12:30:45 2023'

Для произвольного форматирования применяют time.strftime(format, struct_time). Шаблон %Y-%m-%d %H:%M:%S даёт ISO-вид.

struct_t = time.localtime()
formatted = time.strftime('%Y-%m-%d %H:%M:%S', struct_t)
print(formatted)  # 2023-10-31 12:30:45

Проблема: неверный формат кода приводит к ошибке или неожиданному выводу.

Решение: сверяться с таблицей кодов форматирования (например, %Y - год, %m - месяц, %d - день).

Как получить структурированное время (год, месяц, день)?

Функция time.localtime(seconds) возвращает struct_time в локальном часовом поясе. time.gmtime(seconds) - в UTC.

import time
local = time.localtime()
print(local.tm_year, local.tm_mon, local.tm_mday)  # 2023 10 31

Доступны атрибуты: tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday (0=пн), tm_yday, tm_isdst.

Как преобразовать кортеж времени обратно в метку?

time.mktime(struct_time) принимает struct_time (в локальном времени) и возвращает секунды с эпохи.

import time
t = (2023, 10, 31, 12, 30, 45, 1, 304, -1)  # год, месяц, день, час, мин, сек, wday, yday, isdst
secs = time.mktime(t)
print(secs)  # 1698755445.0

Ошибка: если поля некорректны (например, месяц 13), возникает OverflowError или ValueError.

Решение: использовать time.strptime для разбора строки в struct_time.

Как использовать монотонные часы, защищенные от скачков?

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

import time
start = time.monotonic()
time.sleep(1)
end = time.monotonic()
print(f'Прошло {end - start} сек')

Для наносекундной точности используют time.monotonic_ns() или time.perf_counter_ns().

Проблема: на некоторых ОС time.monotonic() может не поддерживаться.

Решение: проверять через hasattr(time, 'monotonic') или использовать time.perf_counter() как fallback.

Расширенные примеры использования библиотеки time

Далее приведены нестандартные и подробные примеры, демонстрирующие возможности модуля.

Создание декоратора для замера времени выполнения функции

Пример
import time
from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        delta = time.perf_counter() - start
        print(f'{func.__name__} занял {delta:.6f} сек')
        return result
    return wrapper

@timer
def compute(x):
    time.sleep(0.3)
    return x * 2

print(compute(5))
compute занял 0.300123 сек
10

Таймер с обратным отсчетом и прерыванием по клавише

Пример
import time
import threading

def countdown(seconds):
    for i in range(seconds, 0, -1):
        print(f'Осталось {i} сек', end='\r')
        time.sleep(1)
    print('Время вышло!')

# Запуск в отдельном потоке, чтобы не блокировать ввод
t = threading.Thread(target=countdown, args=(10,), daemon=True)
t.start()
# Даём пользователю прервать ожидание
input('Нажмите Enter для прерывания...\n')

Результат: обратный отсчет прерывается или завершается.

Измерение времени с использованием nanosecond precision

Пример
import time
start_ns = time.perf_counter_ns()
# короткая операция
sum(range(10**6))
end_ns = time.perf_counter_ns()
print(f'Затрачено {end_ns - start_ns} наносекунд')
Затрачено 123456789 наносекунд

Разбор строки даты в структурированное время

Пример
import time
date_str = '31.10.2023 12:30:45'
struct = time.strptime(date_str, '%d.%m.%Y %H:%M:%S')
print(struct.tm_year, struct.tm_mon, struct.tm_mday)
# Преобразование в метку
secs = time.mktime(struct)
print(secs)
2023 10 31
1698755445.0

Получение времени в UTC и разница с локальным

Пример
import time
utc_now = time.gmtime()
local_now = time.localtime()
offset = time.timezone if time.localtime().tm_isdst == 0 else time.altzone
print(f'UTC: {time.strftime("%H:%M:%S", utc_now)}')
print(f'Local: {time.strftime("%H:%M:%S", local_now)}')
print(f'Смещение в секундах: {-offset}')
UTC: 12:30:45
Local: 15:30:45
Смещение в секундах: 10800

Использование time.process_time() для учета CPU времени

Пример
import time
start = time.process_time()
# интенсивные вычисления
[x**2 for x in range(10**7)]
end = time.process_time()
print(f'CPU time: {end - start:.4f} сек')
CPU time: 0.4500 сек

Ошибка: time.process_time() не учитывает время ожидания (sleep, I/O).

Решение: для полного времени использовать time.perf_counter().

Синхронизация нескольких потоков с задержкой

Пример
import time
import threading
def worker(name, delay):
    time.sleep(delay)
    print(f'{name} завершился')

threads = [threading.Thread(target=worker, args=(f'Поток-{i}', i*0.5)) for i in range(3)]
for t in threads: t.start()
for t in threads: t.join()
Поток-0 завершился
Поток-1 завершился
Поток-2 завершился

Генерация временных меток для имён файлов

Пример
import time
ts = time.strftime('%Y%m%d_%H%M%S', time.localtime())
filename = f'backup_{ts}.zip'
print(filename)  # backup_20231031_123045.zip

Это удобно для логов и бэкапов.

Библиотека time в Python - comments

En
библиотека время python (python)