Бенчмаркинг SciPy с помощью airspeed velocity#
Этот документ представляет бенчмаркинг, включая просмотр результатов тестов SciPy онлайн, написание бенчмарк-теста и его локальный запуск. Для видеообзора написания теста и его локального запуска см. Тестирование производительности SciPy.
Как написано в документация airspeed velocity (asv):
Airspeed velocity (asv) - это инструмент для бенчмаркинга Python-пакетов на протяжении их жизненного цикла. Время выполнения, потребление памяти и даже пользовательские вычисляемые значения могут отслеживаться. Результаты отображаются в интерактивном веб-интерфейсе, для размещения которого требуется только базовый статический веб-сервер.
Чтобы понять, что это значит, посмотрите на скорость полета ненагруженного scipy. Каждый график суммирует время выполнения конкретного теста по истории коммитов проекта; то есть при слиянии каждого коммита запускается бенчмарк-тест, измеряется его время выполнения, и отображается затраченное время. Помимо отслеживания производительности кода, коммит предназначен влияет, запуск все Бенчмарки для каждого коммита помогают выявлять непреднамеренные регрессии: значительное увеличение времени выполнения одного или нескольких тестов. Поскольку SciPy представляет собой сеть взаимосвязанного кода, последствия небольших изменений могут быть не сразу очевидны для контрибьютора, поэтому этот набор бенчмарков упрощает обнаружение регрессий и идентификацию коммита, который их вызвал. Когда вы добавляете значительную новую функцию — или замечаете функцию, для которой ещё нет теста — пожалуйста, рассмотрите возможность написания бенчмарков.
Написание тестов производительности#
The Написание тестов производительности раздел документации airspeed velocity является окончательным руководством по написанию бенчмарков. Пожалуйста, также смотрите README файл бенчмарков SciPy.
Чтобы увидеть, как пишутся бенчмарки, посмотрите на
scipy/benchmarks/benchmarks/optimize_linprog.py. Каждый подкласс
Benchmark определяет тестовый эталон. Например, KleeMinty
класс определяет тест производительности на основе Проблема гиперкуба Клее-Минти, дьявольский тест симплекс-алгоритма для линейного
программирования. Класс состоит из четырёх частей:
setupподготавливает бенчмарк к запуску. Время выполнения этой функции не учитываются в результатах тестирования, поэтому это хорошее место для настройки всех переменных, определяющих задачу. ВKleeMintyнапример, это включает генерацию массивовc,A_ub, иb_ubсоответствующий гиперкубу Клее-Минти вdimsразмерности и сохранение их как переменных экземпляра.time_klee_mintyфактически запускает тест производительности. Эта функция выполняется послеKleeMintyобъект был создан иsetupзапущен, поэтому он получает массивы, определяющие задачу, изself. Обратите внимание, что префиксtimeв имени функции указывает наasvчто время выполнения этой функции является для учёта в результатах тестирования производительности.paramsпредставляет собой список списков, определяющих параметры теста. Бенчмарки запускаются для всех возможных комбинаций этих параметров. Например, при первом запуске бенчмарка первый элементmethods(simplex) передаётся вsetupиtime_klee_mintyв качестве первого аргумента,meth, и первый элемент[3, 6, 9](3) передаётся вsetupиtime_klee_mintyв качестве второго аргумента,dims. При следующем запуске бенчмарка,setupиtime_klee_mintyпередаютсяrevised simplexи6в качестве аргументов, и так продолжается до тех пор, пока не будут использованы все комбинации параметров.param_namesявляется списком удобочитаемых имён для каждого элементаparamsсписок. Используются для представления результатов.
Результаты этого теста за последние несколько лет доступны по клику на KleeMinty.time_klee_minty ссылка на airspeed velocity of an unladen scipy. Обратите внимание, что каждый след на графике соответствует комбинации параметров теста и настроек окружения (например, версии Cython), и видимость следов можно переключать с помощью панели управления слева.
Локальный запуск бенчмарков#
Перед началом убедитесь, что скорость воздушного потока установлен.
После добавления новых тестов производительности вы должны протестировать их локально перед отправкой pull request.
Чтобы запустить все тесты производительности, перейдите в корневую директорию SciPy в командной строке и выполните:
python dev.py bench
где bench активирует набор тестов производительности вместо набора
тестов. Это собирает SciPy и запускает тесты производительности. (Примечание: это может занять некоторое время. Бенчмарки часто выполняются дольше, чем модульные тесты, и каждый бенчмарк запускается несколько раз для измерения распределения времени выполнения.)
Для запуска тестов производительности из определённого модуля тестирования, такого как
optimize_linprog.py, просто добавьте имя файла без
расширения:
python dev.py bench -t optimize_linprog
Для запуска теста производительности, определённого в классе, такого как KleeMinty из
optimize_linprog.py:
python dev.py bench -t optimize_linprog.KleeMinty
Для сравнения результатов тестирования между активной веткой и другой, например main:
python dev.py bench --compare main # select again by `-t optimize_linprog`
Все вышеперечисленные команды отображают результаты в виде простого текста в консоли, и результаты не сохраняются для сравнения с будущими коммитами. Для большего контроля, графического представления и сохранения результатов для будущего сравнения вы можете использовать asv терминальная команда напрямую.
Чтобы использовать, перейдите к scipy/benchmarks в консоли и затем выполните:
asv run
Эта команда запускает весь набор тестов производительности и сохраняет результаты для сравнения с будущими коммитами.
Чтобы запустить только один бенчмарк, например, KleeMinty из
optimize_linprog.py:
asv run --bench optimize_linprog.KleeMinty
Одна замечательная особенность asv заключается в том, что он может автоматически запускать
бенчмарк не только для текущего коммита, но и для каждого коммита в
диапазоне. linprog method='interior-point' был объединен в SciPy
с коммитом 7fa17f2369e0e5ad055b23cc1a5ee079f9e8ca32, поэтому давайте
запустим KleeMinty тест производительности для 10 коммитов между тем временем и сейчас, чтобы
отслеживать его производительность во времени:
asv run --bench optimize_linprog.KleeMinty --steps 10 7fa17f..
Примечание
Это займет некоторое время, потому что SciPy нужно пересобирать для каждого коммита! Чтобы ускорить процесс сборки бенчмарков, вы можете установить ccache и
f90cache. Набор тестов автоматически обнаружит их, если они установлены в /usr/lib и /usr/local/lib. В противном случае вы должны добавить
их в PATH переменная окружения.
Для получения дополнительной информации об указании диапазонов коммитов см. документация по ревизиям git.
Чтобы "опубликовать" результаты (подготовить их к просмотру) и "предварительно просмотреть" их в интерактивной консоли:
asv publish
asv preview
ASV сообщит, что запускает сервер. Используя любой браузер, вы можете просмотреть результаты, перейдя по адресу http://127.0.0.1:8080 (локальная машина, порт 8080).
Для получения гораздо более подробной информации о asv командах,
см. airspeed velocity Команды документации. (Совет:
проверьте asv find команда и --quick,
--skip-existing-commits, и --profile опции для asv run.)