Time.time: примеры (PYTHON)

Работа с временными метками через функцию time.time в языке Python
Раздел: Время, Таймеры
time.time: float

Основные сведения о функции time.time()

Функция time.time() является частью стандартного модуля time в языке Python. Её основная задача - возвращение количества секунд, прошедших с начала "эпохи", которая обычно определяется как 1 января 1970 года, 00:00:00 по Всемирному координированному времени (UTC). Это значение представлено числом с плавающей запятой типа float.

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

Аргументы и возвращаемое значение

Функция time.time() не принимает никаких аргументов. Её вызов всегда происходит без параметров.

Возвращаемое значение - это число с плавающей запятой, представляющее время в секундах. Дробная часть числа позволяет измерять доли секунды (миллисекунды, микросекунды), что зависит от возможностей операционной системы. Например, значение 1725557123.456789 означает 1725557123 целых секунды и 456789 микросекунд.

Важным аспектом является независимость возвращаемого значения от часового пояса. Функция всегда возвращает время в UTC. Для работы с локальным временем требуется дополнительное преобразование.

Простые примеры применения

Ниже представлены базовые варианты использования функции time.time().

Получение текущей временной метки

Самый частый сценарий - получение моментального снимка времени.

import time

current_timestamp = time.time()
print(current_timestamp)
1725557123.456789

Измерение длительности выполнения кода

Функция удобна для замера времени работы участка программы.

import time

start = time.time()
# Имитация работы
sum(range(1000000))
end = time.time()

duration = end - start
print(f"Выполнение заняло {duration:.4f} секунд")
Выполнение заняло 0.0387 секунд

Альтернативные функции в Python

Модуль time и другие модули Python предлагают функции для разных задач измерения времени.

time.perf_counter()

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

time.monotonic()

Также использует монотонные часы, но с меньшей гарантированной точностью, чем perf_counter. Подходит для случаев, когда важна гарантия, что время никогда не уменьшится, например, при расчёте таймаутов.

time.process_time()

Возвращает сумму системного и пользовательского времени процессора, затраченного на текущий процесс. Не включает время, проведённое в ожидании (sleep). Полезна для измерения фактической загрузки CPU.

datetime.datetime.now()

Функция из модуля datetime возвращает объект, представляющий текущую дату и время с учётом часового пояса. Позволяет удобно форматировать время и выполнять арифметические операции с датами.

Выбор функции зависит от задачи: time.time() - для меток UTC, time.perf_counter() - для точных замеров интервалов, datetime - для операций с календарными датами.

Аналоги в других языках программирования

Концепция получения временной метки существует практически во всех языках, но реализация и точность могут различаться.

JavaScript

Метод Date.now() возвращает количество миллисекунд, прошедших с начала эпохи. Точность ограничена миллисекундами.

let timestamp = Date.now();
console.log(timestamp);
1725557123456

PHP

Функция time() возвращает текущую метку в виде целого числа (секунды). Функция microtime(true) возвращает метку с микросекундами в формате float, аналогично Python.

$timestamp = microtime(true);
echo $timestamp;
1725557123.4568

Java

System.currentTimeMillis() возвращает миллисекунды (long), а System.nanoTime() - наносекунды для измерения интервалов с высокой точностью.

long timestamp = System.currentTimeMillis();
System.out.println(timestamp);
1725557123456

Golang

В Go используется time.Now().Unix() для секунд или UnixNano() для наносекунд. Метод UnixMicro() возвращает микросекунды.

import "time"
timestamp := time.Now().Unix()
fmt.Println(timestamp)
1725557123

C#

Свойство DateTimeOffset.UtcNow.ToUnixTimeSeconds() возвращает секунды. Для миллисекунд используется ToUnixTimeMilliseconds().

long timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
Console.WriteLine(timestamp);
1725557123

В отличие от Python, во многих языках по умолчанию возвращаются целые числа (миллисекунды), а не float-значения секунд.

Распространённые ошибки и их причины

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

Ошибка интерпретации временной метки

Начинающие разработчики иногда пытаются интерпретировать возвращаемое число как обычную дату. Требуется преобразование.

import time

timestamp = time.time()
print(f"Дата: {timestamp}") # Неверно
Дата: 1725557123.456789

Для преобразования метки в читаемую строку нужно использовать time.ctime() или datetime.fromtimestamp().

Некорректное измерение коротких интервалов

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

import time

start = time.time()
# Очень короткая операция
end = time.time()
print(end - start)
0.0

В таких случаях рекомендуется использовать time.perf_counter().

Сравнение меток без учёта float-погрешности

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

import time

t1 = time.time()
t2 = time.time() # Вызывается практически одновременно

print(t1 == t2) # Может быть False
False

Следует сравнивать с допустимой погрешностью (epsilon).

Изменения в новых версиях Python

Хотя сама функция time.time() остаётся стабильной, в модуль time добавлялись новые функции для более точных измерений.

В Python 3.3 была добавлена функция time.perf_counter(), обеспечивающая максимально точное измерение интервалов с использованием монотонных часов.

В Python 3.7 появились функции time.time_ns(), time.perf_counter_ns() и time.monotonic_ns(), которые возвращают целочисленные значения в наносекундах. Это позволяет избежать потери точности при работе с числами с плавающей запятой для очень больших значений времени.

Начиная с Python 3.8, time.time() на некоторых платформах (например, Windows и некоторых Unix+системах) также использует монотонные часы для получения времени, что делает её более устойчивой к корректировкам системных часов, но это деталь реализации, а не изменение поведения.

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

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

Создание уникального имени файла

Временная метка часто служит основой для генерации уникальных имён файлов, что исключает конфликты.

Пример python
import time
import os

def create_unique_filename(prefix, extension):
    timestamp = int(time.time() * 1000)  # Используем миллисекунды
    return f"{prefix}_{timestamp}.{extension}"

filename = create_unique_filename("report", "pdf")
print(filename)
report_1725557123456.pdf

Реализация кеширования с таймаутом

Метки времени помогают организовать простой механизм кеширования данных с истечением срока действия.

Пример python
import time

cache = {}

def set_with_ttl(key, value, ttl_seconds):
    expire_time = time.time() + ttl_seconds
    cache[key] = (value, expire_time)

def get_with_ttl(key):
    if key not in cache:
        return None
    value, expire_time = cache[key]
    if time.time() > expire_time:
        del cache[key]
        return None
    return value

# Пример использования
set_with_ttl("user_data", {"id": 123}, ttl_seconds=5)
print(get_with_ttl("user_data"))  # Сразу после установки
time.sleep(6)
print(get_with_ttl("user_data"))  # После истечения TTL
{'id': 123}
None

Анализ производительности с агрегацией

Можно собирать статистику по времени выполнения разных функций.

Пример python
import time
from collections import defaultdict

performance_stats = defaultdict(list)

def measure_performance(func_name):
    def decorator(func):
        def wrapper(*args, **kwargs):
            start = time.time()
            result = func(*args, **kwargs)
            duration = time.time() - start
            performance_stats[func_name].append(duration)
            return result
        return wrapper
    return decorator

@measure_performance("calculate_square")
def calculate_square(n):
    return n * n

# Многократный вызов функции
for i in range(1000):
    calculate_square(i)

# Анализ результатов
for func_name, times in performance_stats.items():
    avg_time = sum(times) / len(times)
    print(f"{func_name}: среднее время {avg_time:.6f} сек, вызовов {len(times)}")
calculate_square: среднее время 0.000001 сек, вызовов 1000

Синхронизация событий в распределённых системах

Временные метки в UTC полезны для согласования событий в разных часовых поясах или серверах.

Пример python
import time
import json

# Имитация события в системе
event = {
    "id": "event_001",
    "action": "user_login",
    "timestamp_utc": time.time(),  # Отправляется в центральный лог
    "server": "eu-west-1"
}

# Преобразование метки для удобства чтения
from datetime import datetime
event["human_time"] = datetime.utcfromtimestamp(event["timestamp_utc"]).isoformat()

print(json.dumps(event, indent=2))
{
  "id": "event_001",
  "action": "user_login",
  "timestamp_utc": 1725557123.456789,
  "server": "eu-west-1",
  "human_time": "2024-09-05T12:25:23.456789"
}

питон time.time function comments

En
Time.time Return the current time in seconds since the epoch