Ускорь Python-код с помощью Microsoft Pyjion
Pyjion - проект с открытым исходным кодом, предназначенный для повышения производительности кода Python за счет оптимизированных возможностей JIT-компиляции пакета .NET. С помощью Pyjion можно добиться значительного повышения скорости работы приложений на Python. В этой статье разбираемся, как оптимизировать и ускорить Python код.

Что такое Pyjion
Самый распространенный способ ускорить код на Python - использовать CPython, официальный интерпретатор Python. Он компилирует код в промежуточный язык, называемый байткодом
, и делает это каждый раз, когда выполняется ваш код.
Это обеспечивает большую гибкость, но имеет и обратную сторону. Простые вычисления, в которых процессоры очень эффективны, такие как арифметика целых чисел и чисел с плавающей запятой, в CPython выполняются значительно медленнее, чем в других интерпретаторах.
На практике разработчики Python используют такие инструменты, как Cython, чтобы сделать числовые операции более эффективными, компилируя код заранее, используя расширения Си. Это эффективное решение для повышения производительности, но не идеальное для быстрых итераций или экспериментов, особенно в Jupyter.
Именно здесь на помощь приходит Pyjion. Pyjion - это пакет для Python 3.10, который анализирует код Python и оптимизирует его на лету, используя компилятор JIT, или “Just-in-Time” (Точно в Нужное Время). Его можно использовать в программе, просто импортировав библиотеку Pyjion и включив ее. Все, что выполняется после этого утверждения, компилируется JIT.
Как произноситcя
Cлово произносится как “пиджион”, от английского “pigeon” (голубь). @DinoV хотел придумать имя, в котором было бы что-то с “Python” - часть “Py” - и что-то с “JIT” - часть “JI” - и чтобы оно было произносимым.
Основные особенности
- JIT-компилятор с поддержкой профилей
- Встроенная 64-битная поддержка плавающих и целых чисел
- Маленький, быстрый компилятор
- Windows, macOS и Linux
- Поддержка процессоров Intel и ARM
- Встроенный IL и ASM дизассемблер
- Поддержка встроенных инструментов отладки и профилирования
Технология
Pyjion компилирует нативный байткод CPython в машинный код. Без Pyjion CPython использует основной цикл оценки (называемый frame evaluation loop
) для итерации опкодов. Компилятор Pyjion состоит из 3 основных этапов:
- Построение “таблицы стека” абстрактных типов в каждой позиции опкода
- Компилирование опкодов CPython в инструкции IL (ECMA335 CIL).
- Передача кодов операций CIL в компилятор .NET EE для преобразования в родной машинный код/ассемблер
Бенчмарки
Тесты показывают, что Python + Pyjion примерно в два-три раза быстрее обычного Python для реальной работы.

Некоторые из оптимизаций позволяют ускорить работу до 10 раз. Обычная арифметика, которая всегда является хорошим кандидатом для JIT-оптимизации, может быть на порядок быстрее.
Ограничения
Некоторые возможности Python, такие как операторы with
или async/await
, еще не реализованы. Обе эти функции находятся в дорожной карте. Pyjion включает промежуточный слой, который позволяет приложениям WSGI работать на Pyjion. Долго работающие приложения, такие как веб-приложения, являются хорошими кандидатами для JIT-ускорения.
Установка
Pyjion требует:
После выполнения шагов по установке Pyjion его можно использовать как обычный модуль Python, который можно импортировать в среду разработки:
|
|
После импорта Pyjion включите JIT с помощью функции enable
:
|
|
Любой код Python, который вы напишете или импортируете после включения Pyjion, будет скомпилирован JIT. Вам не нужно выполнять функции в каком-либо специальном API, все полностью прозрачно:
|
|
Вы также можете запустить любой скрипт или модуль через Pyjion:
|
|
Или, для существующего модуля Python:
|
|
Вот и все!
Сравнение
Сравнение Pyjion с:
PyPy
Сайт: https://www.pypy.org/
PyPy - это реализация Python со своим собственным JIT. Самым большим отличием от Pyjion является то, что PyPy не поддерживает все модули расширения C без модификации, если только они не используют CFFI или не работают с избранным подмножеством CPython C API, которое PyPy поддерживает. Pyjion также стремится поддерживать множество JIT-компиляторов, в то время как PyPy поддерживает только свой собственный JIT-компилятор.
Pyston
Сайт: https://github.com/pyston/pyston
Pyston - это реализация Python, использующая LLVM в качестве JIT-компилятора. По сравнению с Pyjion, Pyston имеет частичную поддержку CPython C API, но не полную. Pyston также поддерживает только LLVM в качестве JIT-компилятора.
Numba
Сайт: https://numba.pydata.org/
Numba - это JIT-компилятор для “ориентированного на массивы и математически тяжелого кода Python”. Это означает, что Numba ориентирован на научные вычисления, в то время как Pyjion пытается оптимизировать весь код Python. Numba также поддерживает только LLVM.
IronPython
Сайт: https://ironpython.net/
IronPython - это реализация Python, реализованная с помощью .NET. В то время как IronPython пытается быть пригодным для использования из .NET, Pyjion не имеет истории совместимости с .NET. Это также означает, что IronPython не может использовать модули расширения C, в то время как Pyjion может.
Nuitka, Shedskin
Сайт Nuitka: https://nuitka.net/pages/overview.html
Сайт Shedskin: https://github.com/shedskin/shedskin
И Nuitka, и Shedskin являются транспиляторами Python в C++, что означает, что они переводят код Python в эквивалентный код C++. Будучи JIT, Pyjion не является транспилятором.
Полезные ссылки
- Официальная страница: https://www.trypyjion.com/
- GitHub репозиторий: https://github.com/tonybaloney/pyjion
- Документация: https://pyjion.readthedocs.io/en/latest/
- Живое тестирование: https://live.trypyjion.com/
- Скачать: https://pypi.org/project/pyjion/