Cython
Cython | |
---|---|
![]() | |
Класс языка | свободное и открытое программное обеспечение, реализация языка программирования[вд], транспайлер, язык программирования и Python-библиотека[вд] |
Появился в | 28 июля 2007 |
Автор | Robert Bradshaw, Stefan Behnel и др. |
Выпуск | |
Тестовая версия | 3.0.0 alpha 11 |
Испытал влияние | Pyrex |
Лицензия | Apache License |
Сайт | cython.org |
ОС | Linux, Unix-подобная операционная система, Windows[2] и macOS[2] |
Cython — язык программирования, упрощающий написание модулей С/C++ кода для Python. Кроме стандартного синтаксиса Python, поддерживаются:
- прямой вызов функций и методов C/C++ из кода на Cython;
- строгая типизация переменных, классов, атрибутов классов.
Код Cython преобразуется в C/C++ код для последующей компиляции и впоследствии может использоваться как расширение стандартного Python или как независимое приложение со встроенной библиотекой выполнения Cython.
История
Cython является наследником языка программирования Pyrex, но имеет больше возможностей и оптимизаций.[3]
Преимущества
Cython имеет очень близкий синтаксис к Python.
Особое преимущество такого «бесшовного» подхода в смешивании Python/C состоит в том, что существующий Python-код может быть настроен на работу почти со скоростью С простым добавлением нескольких статических объявлений типов и некоторыми адаптациями в критических циклах, без необходимости в сложном коде интерфейса. Скорость кодирования и удобочитаемость кода остаются сравнимы с Python.
В связи с пониженными накладными расходами в управляющих структурах (особенно в циклах), оптимистической оптимизацией и (ограниченным) выводом типов, скомпилированный Cython код Python обычно выполняется быстрее, чем в CPython 2.6.x, хотя абсолютное улучшение в значительной степени зависит от кода. С объявлениями типов типичные ускорения для численных вычислений/массивов составляет около 100—1000 раз.[4] Для сравнения, типичное увеличение скорости при использовании Psyco (JIT-компилятор для Python) составляет около 4—100 раз.[5]
Cython был оптимизирован для низких накладных расходов на вызов подпрограмм, в связи с чем вызов из Python внешнего C/C++ кода через оболочку Cython, как правило, быстрее, чем при использовании большинства других решений.[6][7]
Пример
Следующий пример вычисляет функцию Аккермана:
# Файл ackermann.pyx def ackermann(int m, int n): if m == 0: return n + 1 elif n == 0: return ackermann(m - 1, 1) else: return ackermann(m - 1, ackermann(m, n - 1)) print("Ackermann:") print(ackermann(0, 3)) print(ackermann(1, 4))
Чтобы получить исполняемый файл, его нужно транслировать в Си (здесь и ниже - команды оболочки UNIX-подобной системы)[8]:
cython --embed ackermann.pyx -o ackermann.c
После чего можно откомпилировать полученный промежуточный файл[8]:
gcc -g -O2 -o ackermann ackermann.c `python-config --includes --ldflags`
Альтернативы
Для привязки библиотек Си может использоваться SWIG, который поддерживает сразу несколько языков программирования, но из-за своей обобщённости несколько проигрывает Cython в лёгкости использования (количестве необходимого дополнительного кода). Другие значимые аналоги: Parakeet (использует LLVM и JIT-компиляцию специальным образом размеченного кода на Python)[9] и Nuitka (транслятор из Python с C++, который подобно PyPy пытается типизировать программу на Python во время компиляции)[10][8].
См. также
- Unladen Swallow
- PyPy
- Psyco
- Shedskin
- Numba[англ.]
Примечания
- ↑ Release 3.0.10 — 2024.
- ↑ 1 2 https://docs.cython.org/en/latest/src/quickstart/install.html
- ↑ Различия с Pyrex Архивировано 25 июля 2011 года.
- ↑ gmane.comp.python.cython.devel — Passing a pointer from Python (неопр.). Дата обращения: 30 ноября 2010. Архивировано из оригинала 14 февраля 2017 года.
- ↑ Psyco — Introduction (неопр.). Дата обращения: 30 ноября 2010. Архивировано 29 ноября 2019 года.
- ↑ wrapper benchmarks for several Python wrapper generators (except Cython) (неопр.). Дата обращения: 30 ноября 2010. Архивировано из оригинала 4 апреля 2015 года.
- ↑ wrapper benchmarks for Cython, Boost.Python and PyBindGen (неопр.). Дата обращения: 30 ноября 2010. Архивировано 3 марта 2016 года.
- ↑ 1 2 3 Herron, 2014.
- ↑ Parakeet: a runtime compiler for numerical Python (неопр.). Дата обращения: 27 ноября 2014. Архивировано из оригинала 12 ноября 2014 года.
- ↑ Nuitka Home (неопр.). Дата обращения: 27 ноября 2014. Архивировано 30 мая 2020 года.
Ссылки
- Официальная страница проекта
Источники
- Stefan Behnel, Robert Bradshaw, Craig Citro, Lisandro Dalcin, Dag Sverre Seljebotn, Kurt Smith. Cython: The Best of Both Worlds // Computing in Science and Engineering. — 2011. — № 13.2. — P. 31-39. — doi:10.1109/MCSE.2010.118.
- Philip Herron. Cython: Python to native code // Linux Format. — 2014. — № 12 / LXF191. — P. 84-87. — ISSN 1470-4234.
- Philipp Herron. Learning Cython Programming. — Packt, Сентябрь2013. — 110 p. — ISBN 9781783280797.