Работа с модулем time: секунды, паузы и формат времени
Основы работы с библиотекой 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Это удобно для логов и бэкапов.