Библиотеку packaging ускорили в 3 раза
packaging — это библиотека, которую использует почти всё в Python-экосистеме для работы с версиями и зависимостями. Она встроена в pip, а pip встроен в Python — так что это буквально самая распространённая сторонняя библиотека в мире.
Когда pip резолвит зависимости, он создаёт миллионы объектов Version и SpecifierSet. Буквально миллионы — в бенчмарке, который использовал автор, было 4,8 миллиона. Каждый раз парсится регулярка, создаются объекты, сравниваются версии. Это занимает время.
➡️ Что сделал мейнтейнер библиотеки?
Взял новый статистический профайлер из Python 3.15, прогнал через него реальные данные (все версии когда-либо загруженные на PyPI) и нашёл узкие места.
Оказалось, что регулярка — не главная проблема. Основное время уходило на:
🔘Создание лишних объектов (NamedTuple внутри Version — убрал, +20%)
🔘Дублирование работы (Version создавался дважды в одном месте — исправил, +37%)
🔘Неоптимальный код (генераторы вместо map, singledispatch вместо if — переписал)
Результат:
🔘Чтение версий: 19,6 сек → 9,9 сек (2x)
🔘Проверка requires-python: 105 сек → 33,9 сек (3x)
🔘Количество создаваемых Version в pip: 4,8M → 400K
Все исправления будут в версии 26, уже вышла rc1, финальный релиз обещают на днях.
@zen_of_python
Post #4707
3.91K
- 👍 17
- ❤🔥 6