Cython

Cython
Cython-logo.svg
Основные данные
Парадигмы : мультипарадигматический
Год публикации: 28 июля 2007 г.
Разработчик: Роберт Брэдшоу, Стефан Бенель и др.
Текущая  версия 0.29.21   (8 июля 2020 г.)
Печатать : сильный , статический , динамическийутиная печать »)
Под влиянием: Python , C , C ++
Операционная система : Linux , unix-подобная система
Лицензия : Лицензия Apache, версия 2.0, лицензия Apache
cython.org

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

Основные области применения является соединением внешних библиотек к CPython - переводчик , а также ускорение кода Python. Компилятор Cython также можно использовать для компиляции чистых модулей Python.

Сгенерированный код не является самодостаточным, но требует среды выполнения, совместимой с CPython . Как создание двоичных модулей («модуль расширения»), которые могут быть динамически importзагружены в интерпретатор Python с помощью команды, так и интеграция компоновщика интерпретатора CPython в сгенерированный модуль, так что исполняемый файл Программа создана ( встраивание ).

История развития

Cython основан на Pyrex Грега Юинга (впервые опубликовано 4 апреля 2002 г.). В июле 2007 года компилятор Cython был отделен от Pyrex как независимый, открыто разработанный проект Робертом Брэдшоу и Стефаном Бенелем. С тех пор были предприняты попытки сохранить совместимость двух компиляторов, хотя Cython использует далеко идущие оптимизации и обеспечивает большую совместимость с кодом Python. Важные отличия от Pyrex описаны в документации Cython.

Происхождение имени

Название Cython - это слово-чемодан двух основных языков программирования: Python и C.

цели

Проект Cython поставил перед собой цель разработать компилятор для обычного кода Python, который предлагает максимально возможную производительность и обширную интеграцию с кодом, написанным на C, C ++ и Fortran, посредством дополнительной (явной) статической типизации.

Cython - это оптимизирующий компилятор, но не в обычном понимании компилятора, генерирующего двоичный код . Скорее, перевод в код C позволяет оставить компилятору C многие фундаментальные оптимизации и настройки платформы . Таким образом, компилятор Cython может ограничиться высокоуровневой оптимизацией на уровне AST .

Код C, который генерирует Cython, в значительной степени переносим с точки зрения платформ (процессор, компилятор C и операционная система) и версий CPython. В настоящее время (версия 0.28.5) поддерживаются CPython версий 2.6 и 2.7, а также все, начиная с 3.3. Протестированные платформы включают macOS , Windows и, прежде всего, различные дистрибутивы Linux с 32-битными и 64-битными версиями системы .

характеристики

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

Язык программирования обеспечивает языковую интеграцию между Python и C в первую очередь за счет типов данных. Различные конструкции языка Python могут применяться как к типам данных Python, так и к типам данных C. Примером является цикл for, который в Python является циклом foreach , то есть он может работать с любым итеративным контейнером (например, списками или файлами). В Cython этот цикл также может выполняться для списков C ++, массивов и подмассивов C, а также для разделов указателей (срезов, например, ptr[2:8]для смещений 2–7). Кроме того, существует автоматическое преобразование между различными типами данных Python и типами данных C как для скалярных типов (чисел), так и для символьных строк и структурированных типов данных (например, типов структур C и словарей Python).

спектакль

Многие из оптимизаций, которые компилятор Cython выполняет автоматически, приводят к специализации сгенерированного кода C. Для этого компилятор использует явные объявления статических типов и (простой) вывод типов , чтобы сгенерировать специализированный код C для используемых типов данных и определенных шаблонов кода. Большая часть оптимизаций в компиляторе Cython связана с циклами, поскольку здесь обычно накапливается большая часть общей среды выполнения.

Управляющие структуры (особенно циклы) транслируются во много раз быстрее с помощью Cython и компилятора C, чем когда они интерпретируются CPython. Это связано с оптимистической оптимизацией и выводом типа. Это означает, что код Python, скомпилированный с помощью Cython, обычно работает быстрее, чем в CPython 2.6.x, даже без явного объявления типов, хотя относительная производительность, естественно, зависит от рассматриваемого кода. Однако за счет статического объявления типов данных и результирующей специализации кода C обычно можно добиться многократного ускорения. В частности, в случае математических вычислений улучшения во время выполнения часто достигаются от ста до тысячи раз. Для сравнения, типичное ускорение с помощью JIT-компилятора Python Psyco составляет от четырех до ста раз , а с PyPy в отдельных случаях до двенадцати раз.

Код, сгенерированный Cython для функций, оптимизирован для быстрой распаковки и преобразования параметров вызова. Следовательно, вызов собственного кода Python через оболочку Cython обычно выполняется быстрее, чем другие реализации оболочки для Python.

области применения

Наиболее важные области применения Cython - это подключение внешних библиотек к интерпретатору CPython, а также ускорение кода Python, особенно в математических вычислениях и вычислительно-ресурсоемких алгоритмах .

Например, система компьютерной алгебры SageMath в значительной степени основана на коде Cython. Это используется для реализации математических алгоритмов, а также для связывания внешних кодов на C, C ++ и Fortran. Cython также поддерживает очень эффективное взаимодействие с NumPy - матриц , которые на основании этих расчетов значительно упрощается.

Высокопроизводительная XML- библиотека lxml в значительной степени реализована в Cython. Внешние библиотеки C libxml2 и libxslt связаны с интерпретатором Python.

Другой пример из среды разработчика Cython Core - библиотека MPI mpi4py. Он соединяет различные реализации MPI с CPython.

В указателе пакетов Python есть небольшой список других библиотек, реализованных в Cython.

Связанные и похожие проекты

  • Pyrex - предшественник Cython
  • Unladen Swallow - оптимизированная среда выполнения CPython; на основе LLVM
  • PyPy - структура компилятора JIT и среда выполнения Python, написанная на диалекте Python (RPython)
  • Psyco - специализированный JIT-компилятор и оптимизатор кода для среды выполнения CPython
  • Shed Skin - статически типизированный Python-подобный язык программирования, скомпилированный в соответствии с C ++.

Индивидуальные доказательства

  1. Релиз 0.29.21 . 8 июля 2020 г. (по состоянию на 9 июля 2020 г.).
  2. github.com . (доступ 2 февраля 2020 г.).
  3. Cython: C-расширения для Python . (доступ 8 июля 2018 г.).
  4. оригинальные версии предшественника Pyrex
  5. Совместимость с Python 2, заявленной целью для будущего Cython версии 1.0 ( сувенир в оригинале от 10 августа 2011 года в Internet Archive ) Info: архив ссылка автоматически вставляется и еще не проверена. Проверьте исходную ссылку и ссылку на архив в соответствии с инструкциями, а затем удалите это уведомление. @ 1@ 2Шаблон: Webachiv / IABot / wiki.cython.org
  6. срезы на docs.python.org, доступ 2 августа 2018 г.
  7. gmane.comp.python.cython.devel - сравнение Cython и CPython 2.6.2 с помощью pybench
  8. gmane.comp.python.cython.devel - Передача указателя из Python ( сувенира в оригинале с 14 февраля 2017 года в интернет - архив ) Info: архив ссылка автоматически вставляется и еще не проверен. Проверьте исходную ссылку и ссылку на архив в соответствии с инструкциями, а затем удалите это уведомление. @ 1@ 2Шаблон: Webachiv / IABot / thread.gmane.org
  9. ^ Psyco - Введение
  10. Скорость PyPy 1.4 по сравнению с CPython 2.6.2 с / без Psyco
  11. C ++ обертка тесты для различного Python обертки генераторы (без Cython) ( Memento из в оригинале от 4 апреля 2015 года в Internet Archive ) Info: архив ссылка автоматически вставляется и еще не проверена. Проверьте исходную ссылку и ссылку на архив в соответствии с инструкциями, а затем удалите это уведомление. @ 1@ 2Шаблон: Webachiv / IABot / telecom.inescporto.pt
  12. Тесты оболочки C ++ для Cython, Boost.Python и PyBindGen
  13. Список пакетов Python, реализованных в Cython на PyPI