Пять проектов, которые помогают ускорить код на Python

Python — простой и удобный динамический язык язык, но все отлично знают про его слабость: он работает медленнее, чем код на Си, Java или даже JavaScript, когда дело доходит до задач, которым требуется интенсивная работа ЦП. Если вы не хотите с этим мириться и считаете, что просто вставить в компьютер больше оперативной памяти — не выход, то у вас остаётся два пути:

  • Можно использовать для языка другую среду (скорее всего, у вас CPython). Это достаточно серьёзный шаг, но и эффект должен быть соответствующий.
  • Можно переписать существующий Python-код, оптимизируя его для большей скорости. Это, конечно, потребует больших трудозатрат.

Приводим пять проектов, которые попытались решить эту проблему одним из двух этих способов.

PyPy

Среди всех кандидатов на замену CPython самым выделяющимся является PyPy. Quora, например, использует его на продакшене. Пожалуй, у него есть все шансы стать средой по умолчанию из-за отличной совместимости с существующим кодом.

PyPy использует JIT-компиляцию, так же, как и движок Google Chrome для выполнения JavaScript, что и даёт прирост в скорости. Однако для любителей использовать самые последние возможности языка есть неприятная новость — PyPy реализует поддержку новых версий языка со значительной задержкой.

Pyston

Этот проект, который был спонсирован Dropbox’ом, использует LLVM (Low Level Virtual Machine) инфраструктуру для компилятора, который тоже использует JIT. Если проводить сравнение с PyPy, Pyston ещё только на начальном уровне развития — актуальная версия сейчас 0.5.1, и она поддерживает далеко не все возможности языка.

Nuitka

Вместо того, чтобы увеличивать производительность байткод-компилятора и интерпретатора Python, некоторые разработчики решили, что код на Python можно транслировать в другие языки, которые уже сами по себе выполняются быстро. Так поступила и команда Nuitka — их проект компилирует программы Python в код на C++. Реализация во многом опирается на существующие бинарники среды Python, что несколько ограничивает переносимость проекта, но не стоит недооценивать прирост скорости, который предоставляет такая трансляция. В дальнейшем авторы планируют транслировать Python напрямую в Си (правда, это планы на весьма далёкое будущее), что ускорит скорость работы ещё во много раз.

Cython

Cython — надстройка над Python, особая версия языка, которая компилируется в Си и интерфейсы с C/C++ кодом. Это один из путей для написания Си расширений для Python (чтобы могли быть имплементированы участки кода, которые требуют особой скорости). Впрочем, его можно использовать и отдельно от обычного Python. Обратная сторона медали заключается в том, что перенос существующей кодовой базы не будет полностью автоматическим — технически, вы уже пишете не совсем на Python.

Cython достаточно широко распространён и используется во многих библиотеках. Так, например, некоторые алгоритмы в scikit-learn написаны именно на Cython для повышения производительности.

Numba

Numba комбинирует два предыдущих подхода. От Cython она берёт идею, что следует ускорять те части языка, которые больше всего этого требуют (например, математические вычисления, привязанные к ЦП); так же, как PyPy или Pyston, она делает это с помощью LLVM. Функции, компилируемые Numba, могут быть помечены особыми декораторами, и Numba будет работать над их ускорением вместе с NumPy. Однако Numba не использует JIT, поэтому на компиляцию уходит дополнительное время.

Перевод статьи «5 projects that push Python performance»