Выпуск Pyston 2, реализации языка Python с JIT-компилятором

После трёхлетнего затишья в разработке опубликован релиз проекта Pyston 2, развивающего высокопроизводительную реализацию языка Python, использующую наработки проекта LLVM. Реализация примечательна применением современных технологий JIT-компиляции и нацелена на достижение высокой производительности, близкой к производительности традиционных системных языков, таких как C++. Код прошлых выпусков Pyston распространялся под лицензией Apache, но код Pyston 2 пока недоступен, а опубликованы лишь готовые сборки для Ubuntu 18.04 и 20.04 (для загрузки доступен архив с кодом, но в нём лишь заглушка с информацией, что проект пока является закрытым).

В отличие от прошлых выпусков версия Pyston 2 помечена как стабильный, а не тестовый выпуск. Проведена большая работа по оптимизации производительности и Pyston 2 теперь быстрее штатного Python 3.8 примерно на 20% при прохождении тестового набора python-macrobenchmarks. Наиболее заметный выигрыш в производительности отмечается для нагрузок, свойственных web-приложениям. В отдельных тестах, таких как chaos.py и nbody.py, Pyston 2 опережает Python 3.8 в два раза. Ценой использования JIT является незначительное увеличение потребления памяти.

С точки зрения совместимости со штатным Python, проект Pyston преподносится как наиболее совместимая с CPython альтернативная реализация, так как Pyston является ответвлением от основной кодовой базы CPython. В Pyston поддерживаются все возможности CPython, в том числе C API для разработки расширений на языке Си. Изначально Pyston развивался компанией Dropbox, которая в 2017 году приняла решение прекратить разработку своими силами. В начале 2020 года основные разработчики Pyston основали свою компанию, полностью переосмыслили проект и стали заниматься Pyston полный рабочий день.

CPython 3.8.5 Pyston 2.0 PyPy 7.3.2
flaskblogging mean latency 5.1ms 4.1ms 2.5ms
flaskblogging p99 latency 6.3ms 5.2ms 5.8ms
flaskblogging memory usage 47MB 54MB 228MB
djangocms warmup time n/a n/a 105s
djangocms mean latency 14.1ms 11.8ms 15.9ms
djangocms p99 latency 15.0ms 12.8ms 179ms
djangocms memory usage 84MB 91MB 279MB
pylint performance 1x 1.16x 0.50x
mypy performance 1x 1.07x unsupported
pytorch performance 1x 1.00x unsupported
pypy benchmark suite 1x 1.36x 2.48x

Технические подробности о начинке Pyston 2 пока не приводятся, упомянуто только использование DynASM JIT, inline-кэширования и общих оптимизаций CPython. Прошлая версия Pyston использовала JIT на основе трансляции отдельных методов (method-at-a-time), близкий к JIT современных JavaScript-движков. В JIT код на языке Python разбирался и транслировался в промежуточное представление LLVM (IR, Intermediate Representation). Далее IR-представление проходило обработку в оптимизаторе LLVM и передавалось для исполнения в JIT-движок LLVM, который преобразовывал IR-представление в машинный код.

Для получения информации о типах переменных для программ на динамическом языке Python применялась техника вероятностного предсказания типов объектов с последующим уточнением правильности выбора типа в процессе выполнения. Таким образом Pyston постоянно варьировал выполнение между двумя ветками — быстрой, когда данные о предсказанных типах подтверждаются, и медленной, используемой в случае рассогласования данных о типе. Работа могла осуществляться в многопоточном режиме, допускающем параллельное выполнение нескольких нитей кода на языке Python и избавленном от глобальной блокировки интерпретатора (GIL, global interpreter lock).

Источник: http://www.opennet.ru/opennews/art.shtml?num=53987