Улучшена производительность установки Pipenv

Только после смены работы в ноябре 2021 года я начал использовать что-то кроме pip для управления пакетами Python для своих проектов. Я начал использовать pipenv на работе и почувствовал, что он имеет прочную основу и должен использовать его в своих собственных проектах для управления хэшами пакетов и обеспечения более безопасной установки. Я также быстро понял, что в кодовой базе pipenv есть области, которые нуждаются в улучшении.

Я нашел себя в прочесывании GitHub Issues, сортировке отчетов и ответах другим пользователям. В начале 2022 года я объединился с Озом Тирамом — при поддержке Фроста Минга, который искал сопровождающих pipenv, чтобы больше работать исключительно над pdm, современным альтернативным менеджером пакетов python.

В свободное время мы усердно работали над улучшением pipenv, и в этом году вышло более чем несколько интересных релизов. Последний и самый лучший pipenv==2022.9.4 отработал оставшиеся крайности в оптимизации производительности, который был выпущен в конце августа 2022 года.

Бенчмарки были сложным вопросом для ответа в пространстве менеджера пакетов python — есть много переменных: компьютер, подключение к интернету, частные индексы пакетов, множество зависимостей, resolver, installer, о боже! К счастью, в конце июля 2022 года Lincoln Loop создал независимый бенчмарк для менеджеров пакетов python, который запускается на GitHub каждые 6 часов и усредняет результаты за предыдущие 4 запуска для основных менеджеров пакетов python.

Узнав об этом эталоне, мы начали экспортировать результаты в основные моменты выпуска релизов, чтобы иметь данные для отслеживания того, как производительность pipenv изменяется во времени. Релиз 2022.8.5 имел среднее время установки чуть менее 150 секунд, и, возможно, релиз 2022.8.24 был немного быстрее этого, мы только что полностью отказались от pip-shims, в конце концов. На самом деле, установка pipenv всё ещё была медленной, поэтому я провёл выходные, изучая логику установки более подробно и рефакторингом того, как работает пакетная установка.

Основная проблема заключалась в том, что pip вызывался для каждой отдельной зависимости, и на моем ноутбуке с 8-ядерным процессором SMT это звучало как взлетающий самолет. Я начал задумываться о пакетной установке разрешенных зависимостей и вызове pip минимальное количество раз для выполнения одной и той же установки. Оказалось, что предыдущий уровень параллелизма использовал много вычислительной мощности без улучшения времени выполнения.

Другая потенциальная проблема заключалась в том, что выполнение настоящей пакетной установки означало невозможность отображения инкрементного прогресс-бара, где инкремент соответствует завершению установки каждого отдельного пакета. Компромиссом здесь стало чтение stdout процесса pip в реальном времени для пользователей, которые передают флаг --verbose, что позволяет наблюдать за ходом установки, хотя визуально это не является индикатором выполнения.

Мой PR прошел через процесс экспертной оценки, и, к счастью, Oz очень благосклонно отнесся к внесению таких изменений для повышения производительности, поэтому волнение начало расти по мере приближения к выпуску улучшения. Что бы наш эталон сказал нам о производительности установки после выпуска этого улучшения? Основываясь на своих ощущениях, я ожидал, что скорость может увеличиться на 33%, но это была лишь догадка. Затем 31 августа мы получили первые данные о том, что улучшение приблизилось к 50% для случая установки часовых требований, вау!

Итак, как pipenv==2022.9.4 сравнивается с другими менеджерами пакетов по скорости установки? Вот эталонные показатели на момент написания статьи:

Для получения последних результатов и полной статистики по каждой операции: установка, блокировка, обновление, добавление пакета и инструментарий — посетите Python Package Manager Shootout.

Оцените статью
devanswers.ru
Добавить комментарий