Представляем microbenchmark: структурированные проверки производительности.
Превращает небольшие проверки производительности в переиспользуемые Python-сценарии без полноценной системы бенчмарков.
На этой странице 3 раздела
Бенчмарк многократно измеряет время выполнения операции. Python-модуль timeit удобен для одного быстрого замера, но проекту могут понадобиться несколько именованных проверок, общие настройки, сохраняемые результаты и явная ошибка, если операция стала слишком медленной. Полноценные системы бенчмарков требуют больше настройки и статистики, чем нужно небольшой библиотеке.
timeit предоставляет средства измерения, но не модель сценариев или предел времени для автоматических проверок проекта. pyperf и pytest-benchmark дают более строгую статистику и изоляцию. Небольшим проектам могут быть нужны именованные и сохраняемые измерения без полноценной системы бенчмарков.
microbenchmark — лёгкая Python-библиотека для организации небольших проверок производительности. Каждый замер и его результат представлены обычными Python-объектами: их можно объединять, изучать, сохранять в JSON и сравнивать с простым пределом времени. Релиз доступен на GitHub.
Основной API
Scenario хранит измеряемую функцию, её аргументы, имя, описание и число повторов. run() сначала может выполнить несколько прогревочных вызовов, а затем отдельно измеряет каждый запуск через perf_counter().
from microbenchmark import Scenario
def build_list():
return list(range(1000))
scenario = Scenario(build_list, name="build_list", number=500)
result = scenario.run()
print(result.mean)
print(result.best)
print(result.worst)
Получается BenchmarkResult, сохраняющий все длительности вместо немедленного сведения запуска к одному числу. Он предоставляет среднее, лучший и худший результаты. Свойства p95 и p99 возвращают усечённые наборы — самые быстрые 95 или 99 процентов замеров, — а не привычные скалярные перцентили задержки.
Сложение сценариев создаёт плоский упорядоченный ScenarioGroup. Результаты сериализуются в JSON, но десериализация не восстанавливает исполняемые сценарии.
Вызов .cli() добавляет скрипту параметры командной строки --number и предел среднего времени --max-mean; отдельная команда не устанавливается.
Библиотека снабжена аннотациями типов и не имеет обязательных зависимостей.
Альтернативы и компромиссы
timeit остаётся правильным выбором для разового измерения. Группировка операций и автоматический подбор длительности также уменьшают влияние самого таймера.
pyperf подбирает число повторов, запускает измерения в отдельных процессах и сравнивает результаты статистически; pytest-benchmark объединяет проверки замедлений с pytest; Airspeed Velocity отслеживает производительность между изменениями проекта.
Отдельное измерение каждого вызова увеличивает влияние самого таймера и вызова Python-функции. Здесь нет автоматического подбора числа повторов, изоляции процессов или сравнения с эталонным результатом, а --max-mean чувствителен к компьютеру и его текущей нагрузке.
Для кого предназначен microbenchmark
microbenchmark предназначен авторам библиотек, которым нужны несколько переиспользуемых performance-сценариев рядом с кодом. Для более строгих статистических требований лучше выбрать полноценную систему бенчмарков.