Cython
| Cython | |
|---|---|
|
| |
| Основные данные | |
| Парадигмы : | мультипарадигматический |
| Год публикации: | 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 ++.
Индивидуальные доказательства
- ↑ Релиз 0.29.21 . 8 июля 2020 г. (по состоянию на 9 июля 2020 г.).
- ↑ github.com . (доступ 2 февраля 2020 г.).
- ↑ Cython: C-расширения для Python . (доступ 8 июля 2018 г.).
- ↑ оригинальные версии предшественника Pyrex
- ↑ Совместимость с Python 2, заявленной целью для будущего Cython версии 1.0 ( сувенир в оригинале от 10 августа 2011 года в Internet Archive ) Info: архив ссылка автоматически вставляется и еще не проверена. Проверьте исходную ссылку и ссылку на архив в соответствии с инструкциями, а затем удалите это уведомление.
- ↑ срезы на docs.python.org, доступ 2 августа 2018 г.
- ↑ gmane.comp.python.cython.devel - сравнение Cython и CPython 2.6.2 с помощью pybench
- ↑ gmane.comp.python.cython.devel - Передача указателя из Python ( сувенира в оригинале с 14 февраля 2017 года в интернет - архив ) Info: архив ссылка автоматически вставляется и еще не проверен. Проверьте исходную ссылку и ссылку на архив в соответствии с инструкциями, а затем удалите это уведомление.
- ^ Psyco - Введение
- ↑ Скорость PyPy 1.4 по сравнению с CPython 2.6.2 с / без Psyco
- ↑ C ++ обертка тесты для различного Python обертки генераторы (без Cython) ( Memento из в оригинале от 4 апреля 2015 года в Internet Archive ) Info: архив ссылка автоматически вставляется и еще не проверена. Проверьте исходную ссылку и ссылку на архив в соответствии с инструкциями, а затем удалите это уведомление.
- ↑ Тесты оболочки C ++ для Cython, Boost.Python и PyBindGen
- ↑ Список пакетов Python, реализованных в Cython на PyPI