Как измерить время выполнения HTTP-запроса в Python

Ответ

Существует несколько способов измерить время, затраченное на HTTP-запрос в Python, выбор зависит от используемой библиотеки и необходимой точности.

1. Стандартный модуль time

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

import time
import requests

start_time = time.monotonic()
try:
    response = requests.get('https://api.github.com')
    response.raise_for_status() # Проверка на HTTP-ошибки
finally:
    end_time = time.monotonic()
    elapsed_seconds = end_time - start_time
    print(f"Запрос занял: {elapsed_seconds:.4f} секунд")

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

2. Встроенные возможности requests

Библиотека requests автоматически измеряет время от отправки запроса до получения заголовков ответа и сохраняет его в атрибуте response.elapsed. Это самый удобный и идиоматичный способ.

import requests

response = requests.get('https://api.github.com')

# response.elapsed - это объект timedelta
elapsed_seconds = response.elapsed.total_seconds()

print(f"Запрос занял: {elapsed_seconds:.4f} секунд")

3. Современная библиотека httpx

httpx, как и requests, предоставляет атрибут elapsed для синхронных и асинхронных запросов.

import httpx

with httpx.Client() as client:
    response = client.get('https://api.github.com')
    elapsed_seconds = response.elapsed.total_seconds()
    print(f"Запрос занял: {elapsed_seconds:.4f} секунд")

Для production-систем рекомендуется использовать специализированные APM-решения (Application Performance Monitoring) или системы мониторинга, такие как Prometheus, которые предоставляют агрегированные метрики времени ответа.

Ответ 18+ 🔞

Ну, слушай, тут такая хуйня, блядь. Хочешь померить, сколько твой запрос в интернеты ползает? Вариантов, как говна за баней, но есть парочка годных, которые не заставят тебя, сука, мозги выносить.

1. Старый добрый time, он и в Африке time

Прям как дедовский метод, блядь. Взял секундомер, нажал — пошёл запрос, пришёл ответ — выключил. Всё, пиздец, просто. Только учти, он меряет ВСЁ: и то, как ты там с сервером знакомишься, и как данные плетёшься, и как ответ приползает обратно. Овердохуища, короче.

import time
import requests

start_time = time.monotonic()
try:
    response = requests.get('https://api.github.com')
    response.raise_for_status() # Проверка на HTTP-ошибки
finally:
    end_time = time.monotonic()
    elapsed_seconds = end_time - start_time
    print(f"Запрос занял: {elapsed_seconds:.4f} секунд")

Кстати, ёпта, бери monotonic(), а не эту старую time(). Та ещё может подвести, если системные часы вдруг решат, что они в прошлом живут, блядь. А monotonic() — он как часы в армии, только вперёд, сука.

2. Магия внутри requestsresponse.elapsed

А вот это уже красота, блядь! Сама библиотека, хитрая жопа, засекает время от момента "полетели!" до момента "ой, всё, приплыли!". И кладёт это время прямо в ответ, в атрибут elapsed. Красота, ёперный театр! Самый правильный способ, если ты, конечно, не из тех, кто любит велосипеды собирать.

import requests

response = requests.get('https://api.github.com')

# response.elapsed - это объект timedelta
elapsed_seconds = response.elapsed.total_seconds()

print(f"Запрос занял: {elapsed_seconds:.4f} секунд")

3. Модный молодёжный httpx

Ну а это, блядь, для тех, кто в теме. Тот же принцип, что и у requests, только с перчинкой и асинхронностью. Тоже есть этот волшебный elapsed.

import httpx

with httpx.Client() as client:
    response = client.get('https://api.github.com')
    elapsed_seconds = response.elapsed.total_seconds()
    print(f"Запрос занял: {elapsed_seconds:.4f} секунд")

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