[Перевод] Улучшение производительности Python 2.7
От переводчика: в двух словах, в декабре 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-разработчиков по всему миру.