Выпуск Cython 3.0 и Nuitka 1.7, компиляторов для языка Python

После пяти лет разработки опубликован релиз проекта Cython 3.0, развивающего компилятор для языков Python и Cython. Компилятор транслирует Python-код в представление на языках C/C++ и предоставляет дополнительные возможности для взаимодействия кода на языках Python и Си. Cython наиболее востребован для создания Python-обвязок вокруг библиотек на языке Си и для создания модулей на Си, ускоряющих выполнение кода на языке Python. Код компилятора написан на языке Python и распространяется под лицензией Apache 2.0.

Язык Cython является расширенным вариантом языка Python, нацеленным на упрощение интеграции с кодом на языке Си и позволяющим создавать расширения на языке Си для проектов на языке Python так же просто, как писать код на Python. Cython расширяет возможности Python средствами для прямого вызова функций на языке Си, поддерживает определение переменных с типами языка Си и позволяет компилировать итоговый код на языке Cython в представление на языке Си, которое затем собирается штатным системным компилятором. Применение расширенных возможностей языка Cython позволяет значительно повысить эффективность выдаваемого компилятором кода.

Производительность выполнения Python-кода при использовании Cython примерно на 30% выше, чем при использовании CPython при тестировании пакетом pybench. В некоторых случаях, прирост скорости составляет 60-90%, например, при выполнении операций if-elif-else или при работе циклов. Для кода, интенсивно работающего в циклах и использующего встроенные Си-типы Cython (списки, словари, строки), обычно удаётся поднять производительность в разы, а для кода с числовыми вычислениями при использовании статических типов ускорение может достигать 100-1000 раз. Подобная особенность позволяет значительно ускорить работу наиболее критичных к производительности участков Python-кода, переведя их на применение статических Си-типов.

def f(x: cython.double): return x ** 2 – x def integrate_f(a: cython.double, b: cython.double, N: cython.int): i: cython.int s: cython.double dx: cython.double s = 0 dx = (b – a) / N for i in range(N): s += f(a + i * dx) return s * dx

Новый выпуск примечателен изменением схемы нумерации версий. После выпуска 0.29 осуществлён на систему семантического версионирования и вместо выпуска 0.30 сформирован релиз 3.0.0. Новая модель представления версий подразумевает использование нотации X.Y.Z (вместо ранее используемой 0.X.N), в которой X меняется при внесении значительных изменений и изменений нарушающих обратную совместимость, Y меняется при расширении функциональности и Z при исправлении ошибок.

Присвоение номера версии 3.0 также подчёркивает переход Cython на использование синтаксиса и семантики Python 3 по умолчанию (ранее по умолчанию применялась семантика Python 2.7). В новой версии реализована поддержка большинства возможностей ветки Python 3.11 (в прошлом выпуске поддержка ветки Python 3 ограничивалась Python 3.6 и отдельными возможностями из Python 3.7). Поддержка Python 2.6 прекращена.

Из других существенных улучшений выделяется предоставления возможности указания аннотаций Cython в обычном Python-коде без необходимости использования отдельных файлов на языке Cython. В новой версии также добавлена поддержка Unicode символов в идентификаторах, обеспечена автоматическая генерация ufunc для NumPy, добавлены быстрые расширенные типы @dataclass и @total_ordering, по умолчанию обеспечена безопасная обработка исключений в функциях на Си, добавлена ограниченная поддержка API CPython.

Одновременно доступен выпуск проекта Nuitka 1.7, также развивающего компилятор для трансляции скриптов на языке Python в представление на языке C, которое затем можно скомпилировать в исполняемый файл, использующий libpython для обеспечения максимальной совместимости с CPython (используются штатные средства CPython для управления объектами). В Nuitka обеспечена полная совместимость с актуальными выпусками Python 2.6, 2.7, 3.3 – 3.11. По сравнению с CPython скомпилированные скрипты демонстрируют в тестах pystone повышение производительности на 335%. Код проекта распространяется под лицензией Apache.

В новой версии Nuitka предложена опция “–python-flag=isolated”, включая новые изолированный режим для ограничения возможностей импорта модулей из файловой системы. Расширены возможности плагина anti-bloat, который теперь может применяться для уменьшения числа пакетов при использовании библиотек sympy, numpy, torch,transformers, pandas, pycountry,
statsmodels, no-qt, dask, patsy, matplotlib и tqdm (в основном исключена привязка к pytest, dask, tkinter и IPython). Обеспечена совместимость с новыми версиями библиотеки torch. Внесены различные оптимизации.

Release. Ссылка here.