Содержание

Ускорение кода Python с помощью Pyjion

Компилятор Pyjion от Microsoft достиг стабильной версии 1.0

Что такое 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 для реальной работы.

/images/pyjion_benchmarks.png
Python 3.10 в сравнении с Python 3.10 + Pyjion

Некоторые из оптимизаций позволяют ускорить работу до 10 раз. Обычная арифметика, которая всегда является хорошим кандидатом для JIT-оптимизации, может быть на порядок быстрее.

Ограничения

Некоторые возможности Python, такие как операторы with или async/await, еще не реализованы. Обе эти функции находятся в дорожной карте. Pyjion включает промежуточный слой, который позволяет приложениям WSGI работать на Pyjion. Долго работающие приложения, такие как веб-приложения, являются хорошими кандидатами для JIT-ускорения.

Установка

Pyjion требует:

После выполнения шагов по установке Pyjion его можно использовать как обычный модуль Python, который можно импортировать в среду разработки:

1
python -m pip install pyjion

После импорта Pyjion включите JIT с помощью функции enable:

1
2
import pyjion
pyjion.enable()

Любой код Python, который вы напишете или импортируете после включения Pyjion, будет скомпилирован JIT. Вам не нужно выполнять функции в каком-либо специальном API, все полностью прозрачно:

1
2
3
4
>>> def half(x):
...    return x/2
>>> half(2)
1.0

Вы также можете запустить любой скрипт или модуль через Pyjion:

1
pyjion my_script.py

Или, для существующего модуля Python:

1
pyjion -m calendar

Вот и все!

Сравнение

Сравнение Pyjion с:

PyPy

PyPy - это реализация Python со своим собственным JIT. Самым большим отличием от Pyjion является то, что PyPy не поддерживает все модули расширения C без модификации, если только они не используют CFFI или не работают с избранным подмножеством CPython C API, которое PyPy поддерживает. Pyjion также стремится поддерживать множество JIT-компиляторов, в то время как PyPy поддерживает только свой собственный JIT-компилятор.

Pyston

Pyston - это реализация Python, использующая LLVM в качестве JIT-компилятора. По сравнению с Pyjion, Pyston имеет частичную поддержку CPython C API, но не полную. Pyston также поддерживает только LLVM в качестве JIT-компилятора.

Numba

Numba - это JIT-компилятор для “ориентированного на массивы и математически тяжелого кода Python”. Это означает, что Numba ориентирован на научные вычисления, в то время как Pyjion пытается оптимизировать весь код Python. Numba также поддерживает только LLVM.

IronPython

IronPython - это реализация Python, реализованная с помощью .NET. В то время как IronPython пытается быть пригодным для использования из .NET, Pyjion не имеет истории совместимости с .NET. Это также означает, что IronPython не может использовать модули расширения C, в то время как Pyjion может.

Nuitka, Shedskin

И Nuitka, и Shedskin являются транспиляторами Python в C++, что означает, что они переводят код Python в эквивалентный код C++. Будучи JIT, Pyjion не является транспилятором.

Полезные ссылки