Cython это язык программирования , который стремится быть надстройкой на языке программирования Python , разработанная , чтобы дать C -кака исполнения с кодом , который написан в основном в Python с дополнительным дополнительным C-вдохновенного синтаксисом. [4] [5]
Разработчики) | Роберт Брэдшоу, Стефан Бенель и др. |
---|---|
Первый выпуск | 28 июля 2007 г . [1] |
Стабильный выпуск | 0.29.21 (8 июля 2020 г . [±] [2] | )
Предварительный выпуск | 3.0a6 (31 июля 2020 г . [3] ) [±] |
Репозиторий | |
Написано в | Python , C |
Тип | Язык программирования |
Лицензия | Лицензия Apache 2.0 |
Веб-сайт | Cython |
Cython - это скомпилированный язык, который обычно используется для создания модулей расширения CPython . Аннотированный код, подобный Python, компилируется в C или C ++, а затем автоматически обертывается в код интерфейса , создавая модули расширения, которые могут быть загружены и использованы обычным кодом Python с помощью оператора импорта, но со значительно меньшими вычислительными затратами во время выполнения . Cython также упрощает перенос независимого кода C или C ++ в модули, импортируемые из Python.
Cython написан на Python и C и работает в Windows , macOS и Linux , создавая исходные файлы, совместимые с CPython 2.6, 2.7, 3.3 и более поздними версиями.
Cython 3.0.0 находится в разработке. [6]
Дизайн
Cython работает, создавая стандартный модуль Python. Однако поведение отличается от стандартного Python тем, что код модуля, изначально написанный на Python, транслируется на C. Хотя полученный код является быстрым, он делает много вызовов интерпретатора CPython и стандартных библиотек CPython для выполнения реальной работы. Выбор такого расположения значительно сэкономил время разработки Cython, но модули зависят от интерпретатора Python и стандартной библиотеки.
Хотя большая часть кода написана на языке C, обычно требуется небольшой загрузчик-заглушка, написанный на интерпретируемом Python (за исключением случаев, когда целью является создание загрузчика, полностью написанного на C, что может включать работу с недокументированными внутренними компонентами CPython). Однако это не серьезная проблема из-за наличия интерпретатора Python. [7]
Cython имеет интерфейс внешней функции для вызова подпрограмм C / C ++ и возможность объявлять статический тип параметров подпрограмм и результатов, локальных переменных и атрибутов классов.
Программа Cython, реализующая тот же алгоритм, что и соответствующая программа Python, может потреблять меньше вычислительных ресурсов, таких как основная память и циклы обработки, из-за различий между моделями выполнения CPython и Cython. Базовая программа Python загружается и выполняется виртуальной машиной CPython , поэтому как среда выполнения, так и сама программа потребляют вычислительные ресурсы. Программа Cython компилируется в код C, который затем компилируется в машинный код, поэтому виртуальная машина используется только на короткое время при загрузке программы. [8] [9] [10] [11]
Cython использует:
- Оптимистические оптимизации
- Вывод типа (необязательно)
- Низкие накладные расходы в управляющих структурах
- Низкие накладные расходы на вызов функций [12] [13]
Производительность зависит как от того, какой код C генерируется Cython, так и от того, как этот код компилируется компилятором C. [14]
История
Cython является производным от языка Pyrex и поддерживает больше функций и оптимизаций, чем Pyrex. [15] [16] Cython был разветвлен из Pyrex в 2007 году разработчиками пакета компьютерной алгебры Sage , потому что они были недовольны ограничениями Pyrex и не могли получить исправления, принятые сопровождающим Pyrex Грегом Юингом, который предполагал гораздо меньшие возможности для своего инструмента чем имели в виду разработчики Sage. Затем они разделили Pyrex как SageX. Когда они обнаружили, что люди загружают Sage только для того, чтобы получить SageX, а разработчики других пакетов (включая Стефана Бенеля, который поддерживает XML- библиотеку LXML) также поддерживают форки Pyrex, SageX был выделен из проекта Sage и объединен с cython-lxml для стать Cython. [17]
Файлы Cython имеют .pyx
расширение. По сути, код Cython выглядит точно так же, как код Python. Однако, в то время как стандартный Python имеет динамическую типизацию , в Cython по желанию могут быть предоставлены типы, что позволяет повысить производительность, позволяя преобразовывать циклы в циклы C. Например:
def primes ( int kmax ): # Аргумент будет преобразован в int или вызовет TypeError. cdef int n , k , i # Эти переменные объявлены с типами C. cdef int p [1000] # Другой тип C result = [] # Тип Python, если kmax > 1000 : kmax = 1000 k = 0 n = 2, а k < kmax : i = 0, а i < k и n % p [ i ] ! = 0 : i = i + 1, если i == k : p [ k ] = n k = k + 1 результат . append ( n ) n = n + 1 вернуть результат
Пример
Пример программы hello world для Cython более сложен, чем на большинстве языков, поскольку он взаимодействует с Python C API и setuptools
средством создания расширений. Для базового проекта требуется как минимум три файла:
setup.py
Файл , чтобы вызватьsetuptools
процесс сборки , который генерирует модуль расширения- Основная программа Python для загрузки модуля расширения
- Исходный файл (ы) Cython
Следующие листинги кода демонстрируют процесс сборки и запуска:
# hello.pyx - модуль Python, этот код будет переведен на C Cython. def say_hello (): print ( "Привет, мир!" )
# launch.py - загрузчик заглушек Python, загружает модуль, созданный Cython.# Этот код всегда интерпретируется, как обычный Python. # Он не скомпилирован для C.импорт привет привет . say_hello ()
# setup.py - не требуется, если код не распространяется, см. ниже из setuptools import setup из Cython.Build import cythonizesetup ( name = "Приложение Hello world" , ext_modules = cythonize ( "* .pyx" ))
Эти команды создают и запускают программу:
$ python setup.py build_ext --inplace$ python launch.py
Использование в записной книжке IPython / Jupyter
Более простой способ начать работу с Cython - использовать IPython в командной строке (или через консоль Python в браузере под названием Jupyter notebook ):
В [ 1 ]: % load_ext CythonВ [ 2 ]: %% cython ... : def f ( n ): ... : a = 0 ... : for i in range ( n ): ... : a + = i ... : return a ... : ... : cpdef g ( int n ): ... : cdef long a = 0 ... : cdef int i ... : для i в диапазоне ( n ): ... : a + = я ... : вернуться ... : В [ 3 ]: % timeit f ( 1000000 ) 10 циклов , лучшее из 3 : 26,5 мс на циклВ [ 4 ]: % timeit г ( 1000000 ) 1000 циклов , лучше всего из 3 : 279 μ s в петле
что дает 95-кратное улучшение по сравнению с версией на чистом питоне. Более подробная информация по этому вопросу на официальной странице быстрого запуска. [18]
Использует
Cython особенно популярен среди научных пользователей Python [10] [19] [20], где, по словам создателя Python Гвидо ван Россума, у него «идеальная аудитория» . [21] Особо следует отметить:
- Свободное программное обеспечение SageMath система компьютерной алгебры зависит от Cython, как для выполнения и взаимодействия с другими библиотеками. [22]
- Значительные части научных вычислительных библиотек SciPy , pandas и scikit-learn написаны на Cython. [23] [24]
- Некоторые сайты с высокой посещаемостью, такие как Quora, используют Cython. [ нужен лучший источник ] [25]
Область Cython не ограничивается только численными вычислениями. Например, набор инструментов lxml XML написан в основном на Cython, и, как и его предшественник Pyrex, Cython используется для обеспечения привязок Python для многих библиотек C и C ++, таких как библиотека обмена сообщениями ZeroMQ . [26] Cython также можно использовать для разработки параллельных программ для машин с многоядерными процессорами ; эта функция использует библиотеку OpenMP .
Смотрите также
- PyPy
- Нумба
Рекомендации
- ^ Behnel, Стефан (2008). «Компилятор Cython для расширений C в Python» . EuroPython (28 июля 2007 г .: официальный запуск Cython). Вильнюс / Lietuva.
- ^ «Релизы - cython / cython» . Проверено 16 октября 2020 г. - через GitHub .
- ^ "cython / cython" . GitHub . Дата обращения 7 октября 2020 .
- ^ «Cython - обзор - документация Cython 0.19.1» . Docs.cython.org . Проверено 21 июля 2013 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ Смит, Курт (2015). Cython: Руководство для программистов на Python . O'Reilly Media. ISBN 978-1-4919-0155-7.
- ^ «Поддержка идентификаторов Unicode · Проблема № 2601 · cython / cython» . GitHub . Проверено 11 октября 2019 года .
- ^ «Базовое руководство - документация Cython 3.0a6» . cython.readthedocs.io . Проверено 11 декабря 2020 .
- ^ Олифант, Трэвис (20 июня 2011 г.). «Техническое открытие: ускорение Python (NumPy, Cython и Weave)» . Technicaldiscovery.blogspot.com . Проверено 21 июля 2013 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ Бенель, Стефан; Брэдшоу, Роберт; Ситро, Крейг; Дальчин, Лисандро; Сельеботн, Даг Сверре; Смит, Курт (2011). «Cython: лучшее из обоих миров» . Вычислительная техника в науке и технике . 13 (2): 31–39. Bibcode : 2011CSE .... 13b..31B . DOI : 10,1109 / MCSE.2010.118 . S2CID 14292107 .
- ^ а б Seljebot, Даг Сверре (2009). «Быстрые численные вычисления с Cython» . Материалы 8-й конференции «Питон в науке» (SciPy 2009) : 15–22.
- ^ Wilbers, I .; Лангтанген, HP; Ødegård, Å. (2009). Б. Скаллеруд; Х. И. Андерссон (ред.). «Использование Cython для ускорения числовых программ Python» (PDF) . Материалы MekIT'09 : 495–512 . Проверено 14 июня 2011 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ «тесты оболочки для нескольких генераторов оболочки Python (кроме Cython)» . Архивировано из оригинала 4 апреля 2015 года . Проверено 28 мая 2010 года .
- ^ «тесты оболочки для Cython, Boost.Python и PyBindGen» . Архивировано из оригинала 3 марта 2016 года . Проверено 28 мая 2010 года .
- ^ «Cython: C-расширения для Python» . Проверено 22 ноября 2015 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ «Различия между Cython и Pyrex» .
- ^ Юинг, Грег (21 марта 2011 г.). «Re: Информация о саммите по виртуальным машинам и языкам для тех, кто не работает в Pycon (и тех, кто есть!)» (Сообщение в электронную рассылку python-dev ) . Проверено 5 мая 2011 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ Говорит разработчик Sage и Cython Роберт Брэдшоу на конференции Sage Days 29 (22 марта 2011 г.). «Cython: прошлое, настоящее и будущее» . youtube.com . Проверено 5 мая 2011 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ «Сборка кода Cython» . cython.readthedocs.io . Проверено 24 апреля 2017 года .
- ^ «inSCIght: Подкаст по научным вычислениям» (серия 6). Архивировано из оригинального 10 -го октября 2014 года . Проверено 29 мая 2011 года .
- ^ Миллман, Джаррод; Айвазис, Майкл (2011). «Python для ученых и инженеров» . Вычислительная техника в науке и технике . 13 (2): 9–12. Bibcode : 2011CSE .... 13b ... 9M . DOI : 10,1109 / MCSE.2011.36 .
- ^ Гвидо Ван Россум (21 марта 2011 г.). «Re: Информация о саммите по виртуальным машинам и языкам для тех, кто не работает в Pycon (и тех, кто есть!)» (Сообщение в электронную рассылку python-dev ) . Проверено 5 мая 2011 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ Erocal, Burcin; Штейн, Уильям (2010). Проект Sage: объединение бесплатного математического программного обеспечения для создания жизнеспособной альтернативы Magma, Maple, Mathematica и MATLAB (PDF) . Математическое программное обеспечение 'ICMS 2010 . Конспект лекций по информатике. 6327 . Springer Berlin / Heidelberg. С. 12–27. CiteSeerX 10.1.1.172.624 . DOI : 10.1007 / 978-3-642-15582-6_4 . ISBN 978-3-642-15581-9.
- ^ «Примечания к выпуску SciPy 0.7.2» .
- ^ Педрегоса, Фабиан; Вароко, Гаэль; Грамфорт, Александр; Мишель, Винсент; Тирион, Бертран; Гризель, Оливье; Блондель, Матье; Преттенхофер, Питер; Вайс, Рон; Дубур, Винсент; Вандерплас, Джейк; Пассос, Александр; Курнапо, Дэвид (2011). «Scikit-learn: машинное обучение на Python». Журнал исследований в области машинного обучения . 12 : 2825–2830. arXiv : 1201.0490 .
- ^ "Quora все еще работает на PyPy?" .
- ^ «ØMQ: привязка Python» .
Внешние ссылки
- Официальный веб-сайт
- Cython на GitHub