Cython - Cython

Cython
Cython-logo.svg
Разработчики)Роберт Брэдшоу, Стефан Бенель и др.
изначальный выпуск28 июля 2007 г.; 13 лет назад (2007-07-28)[1]
Стабильный выпуск0.29.21 (8 июля 2020 г.; 4 месяца назад (2020-07-08)) [±][2]
Предварительный выпуск3.0a6 (31 июля 2020 г.; 3 месяца назад (2020-07-31)[3]) [±]
Репозиторий Отредактируйте это в Викиданных
Написано вPython, C
ТипЯзык программирования
ЛицензияЛицензия Apache 2.0
Интернет сайтCython.org Отредактируйте это в Викиданных

Cython это язык программирования, который стремится стать суперсет из Язык программирования Python, призванный дать C -подобная производительность с кодом, который написан в основном на Python с необязательным дополнительным синтаксисом на основе C.[4][5]

Cython - это компилируемый язык который обычно используется для создания CPython модули расширения. Аннотированный код, подобный Python, компилируется на C или C ++ затем автоматически завернутый в код интерфейса, создавая модули расширения, которые могут быть загружены и использованы обычным кодом Python с помощью оператора импорта, но со значительно меньшими вычислительными затратами при время выполнения. Cython также упрощает перенос независимого кода C или C ++ в модули, импортируемые из Python.

Cython написан на Python и C и работает на Windows, macOS, и Linux, создавая исходные файлы, совместимые с CPython 2.6, 2.7 и 3.3–3.8.

Cython 3.0.0 находится в разработке.[6]

Дизайн

Cython работает, создавая стандартный модуль Python. Однако поведение отличается от стандартного Python тем, что код модуля, первоначально написанный на Python, транслируется на C. Хотя полученный код является быстрым, он делает много вызовов интерпретатора CPython и стандартных библиотек CPython для выполнения реальной работы. Выбор такого расположения значительно сэкономил время разработки Cython, но модули зависят от интерпретатора Python и стандартной библиотеки.

Хотя большая часть кода написана на языке C, обычно требуется небольшой загрузчик-заглушка, написанный на интерпретируемом Python (за исключением случаев, когда целью является создание загрузчика, полностью написанного на C, что может включать работу с недокументированными внутренними компонентами CPython). Однако это не является серьезной проблемой из-за наличия интерпретатора Python.[нужна цитата ]

Cython имеет интерфейс внешней функции для вызова C /C ++ распорядки и возможность объявить статический тип параметров и результатов подпрограммы, локальных переменных и атрибутов класса.

Программа Cython, реализующая тот же алгоритм, что и соответствующая программа Python, может потреблять меньше вычислительных ресурсов, таких как основная память и циклы обработки, из-за различий между моделями выполнения CPython и Cython. Базовая программа Python загружается и выполняется CPython. виртуальная машина, поэтому и среда выполнения, и сама программа потребляют вычислительные ресурсы. Программа Cython компилируется в код C, который затем компилируется в машинный код, поэтому виртуальная машина используется только на короткое время при загрузке программы.[7][8][9][10]

Cython использует:

  • Оптимистические оптимизации
  • Вывод типа (необязательно)
  • Низкие накладные расходы в управляющих структурах
  • Низкие накладные расходы на вызов функций[11][12]

Производительность зависит как от того, какой код C генерируется Cython, так и от того, как этот код компилируется компилятором C.[13]

История

Cython является производным от Язык Pyrex, и поддерживает больше функций и оптимизаций, чем Pyrex.[14][15] Cython был раздвоенный от Pyrex в 2007 году разработчиками мудрец пакет компьютерной алгебры, потому что они были недовольны ограничениями Pyrex и не могли получить исправления, принятые сопровождающим Pyrex Грегом Юингом, который предполагал гораздо меньшие возможности для своего инструмента, чем предполагали разработчики Sage. Затем они разделили Pyrex как SageX. Когда они обнаружили, что люди загружают Sage только для того, чтобы получить SageX, а разработчики других пакетов (включая Стефана Бенеля, который поддерживает XML библиотека LXML) также поддерживали форки Pyrex, SageX был отделен от проекта Sage и объединен с Cython-lxml чтобы стать Cython.[16]

Файлы Cython имеют .pyx расширение. По сути, код Cython выглядит точно так же, как код Python. Однако, в то время как стандартный Python динамически типизированный в Cython при желании могут быть предоставлены типы, что позволяет повысить производительность и преобразовывать циклы в циклы C. Например:

def простые числа(int kmax):  # Аргумент будет преобразован в int или вызовет TypeError.    cdef int п, k, я  # Эти переменные объявлены с типами C.    cdef int п[1000]  # Другая C тип    результат = []  # Тип Python    если kmax > 1000:        kmax = 1000    k = 0    п = 2    пока k < kmax:        я = 0        пока я < k и п % п[я] != 0:            я = я + 1        если я == k:            п[k] = п            k = k + 1            результат.добавить(п)        п = п + 1    возвращаться результат

Пример

Привет, мир в Cython

Образец Привет, мир программа для Cython более сложна, чем для большинства языков, потому что она взаимодействует с Python C API и setuptools пристройка здания. Для базового проекта требуется как минимум три файла:

  • А setup.py файл, чтобы вызвать setuptools процесс сборки, который генерирует модуль расширения
  • Основная программа на Python для загрузки модуля расширения
  • Исходный файл (ы) Cython

Следующие листинги кода демонстрируют процесс сборки и запуска:

# hello.pyx - модуль Python, этот код будет переведен на C Cython.def скажи привет():    Распечатать("Привет, мир!")
# launch.py ​​- загрузчик заглушек Python, загружает модуль, созданный Cython.# Этот код всегда интерпретируется, как обычный Python.# Он не скомпилирован для C.импорт ПриветПривет.скажи привет()
# setup.py - не требуется, если код не распространяется, см. нижеиз setuptools импорт настраиватьиз Cython.Build импорт цитонизироватьнастраивать(имя = "Привет, мир",      ext_modules = цитонизировать("* .pyx"))

Эти команды создают и запускают программу:

$ python setup.py build_ext --inplace $ python launch.py

Использование в блокноте IPython / Jupyter

Более простой способ начать работу с Cython - через командную строку. IPython (или через консоль Python в браузере под названием Jupyter ноутбук ):

В [1]: %load_ext CythonВ [2]: %%Cython   ...: def ж(п):   ...:     а = 0   ...:     за я в ассортимент(п):   ...:         а += я   ...:     возвращаться а   ...:    ...: cpdef грамм(int п):   ...:     cdef длинный а = 0   ...:     cdef int я   ...:     за я в ассортимент(п):   ...:         а += я   ...:     возвращаться а   ...: В [3]: %время ж(1000000)10 петли, Лучший из 3: 26.5 РС на петляВ [4]: %время грамм(1000000)1000 петли, Лучший из 3: 279 µs на петля

что дает 95-кратное улучшение по сравнению с версией на чистом питоне. Более подробная информация по теме на официальной странице быстрого запуска.[17]

Использует

Cython особенно популярен среди научных пользователей Python,[9][18][19] где у него "идеальная аудитория" по словам создателя Python Гвидо ван Россум.[20] Особо следует отметить:

Сфера деятельности Cython не ограничивается только численными вычислениями. Например, набор инструментов lxml XML написан в основном на Cython, и, как и его предшественник Pyrex, Cython используется для обеспечения привязок Python для многих библиотек C и C ++, таких как библиотека обмена сообщениями. ZeroMQ.[25] Cython также можно использовать для разработки параллельные программы за многоядерный процессор машины; эта функция использует OpenMP библиотека.

Смотрите также

Рекомендации

  1. ^ Бенель, Стефан (2008). "Компилятор Cython для C-расширений в Python". EuroPython (28 июля 2007 г .: официальный запуск Cython). Вильнюс / Lietuva.
  2. ^ «Релизы - cython / cython». Получено 16 октября 2020 - через GitHub.
  3. ^ "cython / cython". GitHub. Получено 7 октября 2020.
  4. ^ "Cython - обзор - документация Cython 0.19.1". Docs.cython.org. Получено 21 июля 2013.
  5. ^ Смит, Курт (2015). Cython: Руководство для программистов на Python. O'Reilly Media. ISBN  978-1-4919-0155-7.
  6. ^ «Поддержка идентификаторов Unicode · Проблема № 2601 · cython / cython». GitHub. Получено 11 октября 2019.
  7. ^ Олифант, Трэвис (20 июня 2011 г.). «Техническое открытие: ускорение Python (NumPy, Cython и Weave)». Technicaldiscovery.blogspot.com. Получено 21 июля 2013.
  8. ^ Бенель, Стефан; Брэдшоу, Роберт; Ситро, Крейг; Дальчин, Лисандро; Сельеботн, Даг Сверре; Смит, Курт (2011). "Cython: лучшее из обоих миров". Вычислительная техника в науке и технике. 13 (2): 31–39. Дои:10.1109 / MCSE.2010.118.
  9. ^ а б Seljebot, Даг Сверре (2009). «Быстрые численные вычисления с Cython». Труды 8-й конференции Python в науке (SciPy 2009): 15–22.
  10. ^ Wilbers, I .; Langtangen, H.P .; Ødegård, Å. (2009). Б. Скаллеруд; Х. И. Андерссон (ред.). «Использование Cython для ускорения численных программ на Python» (PDF). Материалы MekIT'09: 495–512. Получено 14 июн 2011.
  11. ^ "тесты оболочки для нескольких генераторов оболочки Python (кроме Cython)". Архивировано из оригинал 4 апреля 2015 г.. Получено 28 мая 2010.
  12. ^ "тесты оболочки для Cython, Boost.Python и PyBindGen". Архивировано из оригинал 3 марта 2016 г.. Получено 28 мая 2010.
  13. ^ «Cython: C-расширения для Python». Получено 22 ноября 2015.
  14. ^ «Различия между Cython и Pyrex».
  15. ^ Юинг, Грег (21 марта 2011 г.). "Re: Информация о саммите VM и Language для тех, кто не работает в Pycon (и тех, кто есть!)" (Сообщение в электронную рассылку python-dev). Получено 5 мая 2011.
  16. ^ Говорит разработчик Sage и Cython Роберт Брэдшоу на конференции Sage Days 29 (22 марта 2011 г.). "Cython: прошлое, настоящее и будущее". youtube.com. Получено 5 мая 2011.
  17. ^ «Сборка кода Cython». cython.readthedocs.io. Получено 24 апреля 2017.
  18. ^ "inSCIght: Подкаст по научным вычислениям" (Эпизод 6). Архивировано из оригинал 10 октября 2014 г.. Получено 29 мая 2011.
  19. ^ Миллман, Джаррод; Айвазис, Майкл (2011). «Python для ученых и инженеров». Вычислительная техника в науке и технике. 13 (2): 9–12. Дои:10.1109 / MCSE.2011.36.
  20. ^ Гвидо Ван Россум (21 марта 2011 г.). "Re: Информация о саммите VM и Language для тех, кто не работает в Pycon (и тех, кто есть!)" (Сообщение в электронную рассылку python-dev). Получено 5 мая 2011.
  21. ^ Erocal, Burcin; Штейн, Уильям (2010). Проект Sage: объединение бесплатного математического программного обеспечения для создания жизнеспособной альтернативы Magma, Maple, Mathematica и MATLAB (PDF). Математическое программное обеспечение 'ICMS 2010. Конспект лекций по информатике. 6327. Springer Berlin / Heidelberg. С. 12–27. CiteSeerX  10.1.1.172.624. Дои:10.1007/978-3-642-15582-6_4. ISBN  978-3-642-15581-9.
  22. ^ «Примечания к выпуску SciPy 0.7.2».
  23. ^ Педрегоса, Фабиан; Вароко, Гаэль; Грамфорт, Александр; Мишель, Винсент; Тирион, Бертран; Гризель, Оливье; Блондель, Матье; Преттенхофер, Питер; Вайс, Рон; Дюбур, Винсент; Вандерплас, Джейк; Пассос, Александр; Курнапо, Дэвид (2011). «Scikit-learn: машинное обучение на Python». Журнал исследований в области машинного обучения. 12: 2825–2830.
  24. ^ "Quora все еще работает на PyPy?".
  25. ^ «ØMQ: привязка Python».

внешняя ссылка