От переводчика: в двух словах, в декабре 2015 выйдет релиз Python 2.7.11, ускоряющий работу интерпретатора CPython до 20%. Ниже перевод статьи с LWN.net, рассказывающей о сути и процессе произошедших изменений в коде. Имена, в произношении которых я не уверен, даны в оригинальном написании. Об ошибках и неточностях перевода просьба, как обычно, сообщать в личные сообщения.
Несмотря на то, что разработка Python 2 (а конкретно ветки Python 2.7.x) находится сейчас в состоянии «никаких новых фич», которое в обычной ситуации заранее ставит крест на любых крупных изменениях, команда разработки приняла решение рассмотреть и принять backport-патч из Python 3, привносящий заметное улучшение производительности интерпретатора.
Vamsi Parasa из команды оптимизации серверных скриптовых языков Intel предложил патч (описание предложения с бенчмарками), переводящий блок
switch
, отвечающий за обработку Python-байткода, на использование computed goto, как это уже сделано в Python 3. Как объяснял Eli Bendersky, в таком огромном switch
-блоке, как в блоке разбора байткода в CPython (состоящем из более чем 2000(!) строк), это даёт ускорение порядка 15-20%. Это происходит по двум причинам: computed goto
, в отличие от switch-case
, не производит граничных проверок, необходимых для оператора switch
по стандарту C99, и, что, возможно, более важно, CPU может лучше прогнозировать ветвления в таких ситуациях, что приводит к уменьшению числа сбросов конвейера, являющихся по своей природе «дорогой» операцией.Несмотря на то, что некоторые из разработчиков CPython были против внедрения этого патча, т.к. «улучшение производительности — это не багфикс», решение было принято в пользу Intel.
Одной из немаловажных причин стал тот факт, что Intel сообщили о своей готовности в дальнейшем помогать с поддержкой и улучшением CPython при условии открытости ветки 2.7 для изменений, связанных с производительностью. В частности, это значит, что в то время, как разработчики Intel занимаются «скучными» частями (в основном, исправлением ошибок и ускорением ветки 2.7), разработчики-добровольцы из opensource-сообщества смогут уделять больше времени более интересным задачам:
«Делай крутые вещи бесплатно, найди способ получать деньги за выполнение скучных-но-необходимых задач (или оставь это тем, кому за это платят)» — хороший подход к opensource-разработке, в то время, как попытки сделать всё забесплатно — лёгкий путь к выгоранию.
© Nick Coghlan
С этим согласен и «великодушный пожизненный диктатор» ван Россум, в частности потому, что компании Dropbox, на которую он работает, это поможет сохранить «кучу денег». По его словам, в таких больших компаниях процесс перехода на Python 3 происходит достаточно медленно, в то время, как обновление до последней актуальной версии из ветки 2.7 — нормальное явление. С идеей же «сосредоточить усилия на Python 3, тем самым мотивируя сообщество скорее на него мигрировать» Гвидо не согласен.
Патч, ускоряющий работу интерпретатора Python 2.7, принят (коммит) и запланирован к выходу в составе релиза 2.7.11, в декабре 2015. Несмотря на то, что Python 3 представляет множество новых фич, таких как async/await, указание типов и многое другое, Python 2.7 всё ещё остаётся популярным (и в соответствии с текущими планами, поддерживается как минимум до 2020 года), так что эта новость должна обрадовать большое количество Python-разработчиков по всему миру.
Комментарии (5)
Ununtrium
02.07.2015 09:24+1Несмотря на то, что некоторые из разработчиков CPython были против внедрения этого патча, т.к. «улучшение производительности — это не багфикс»
Нет чтобы библиотеки портировать, нет, давайте просто перестанем фиксить второй питон, авось люди перейдут. Гнать ссаной метлой таких разработчиков CPython надо (хотя, учитывая что Гвидо диктатор, их мнение не имеет веса).
Tarvitz
06.07.2015 11:51Указание типов лучше заменить аннотацией типов, чтобы не путать тех, кто не в курсе что это такое :)
const_int
09.07.2015 10:34Сomputed goto это вроде расширение GCC. Кто-нибудь в MSVC уже пробовал скомпилировать с HAVE_COMPUTED_GOTOS?
В коде вроде обычные goto используются, а makeopcodetargets.py подменяет их на computed gotos
kostialopuhin
Кто-нибудь уже сравнивал 2.7.11 для своих приложений?
Интересно что CPython 2.7.10 по сравнению с 2.7.2 по многим бенчмаркам работает медленнее (https://mail.python.org/pipermail/python-dev/2015-June/140418.html), интересно исправят ли что-то для 2.7.11? И опять же, интересно насколько это заметно на реальных задачах.
Utter_step Автор
На бенчмарках из hg.python.org/benchmarks (тут есть в том числе тесты, близкие к реальному примерению, например рендер шаблонов джангой) улучшение до 25%, в среднем между 5 и 10%: article.gmane.org/gmane.comp.python.devel/153401