Лучшие вопросы
Таймлайн
Чат
Перспективы
Cython
Из Википедии, свободной энциклопедии
Remove ads
Cython — язык программирования, упрощающий написание модулей на С/C++ для Python. Кроме стандартного синтаксиса Python, поддерживаются:
- прямой вызов функций и методов C/C++ из кода на Cython;
- строгая типизация переменных, классов, атрибутов классов.
Код Cython преобразуется в C/C++ код для последующей компиляции и впоследствии может использоваться как расширение стандартного Python или как независимое приложение со встроенной библиотекой выполнения Cython.
Remove ads
История
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].
Remove ads
Пример
Следующий пример вычисляет функцию Аккермана:
# Файл 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].
Remove ads
См. также
Примечания
Ссылки
Источники
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads