Китон
![]() | |
Разработчик | Роберт Брэдшоу, Стефан Бенель и др. |
---|---|
Впервые появился | 28 июля 2007 г [1] |
Стабильная версия | 3.0.10 [2] ![]() |
Предварительный выпуск | 3.0.0 beta 2 (27 марта 2023 г [3] ) [±] |
Язык реализации | Питон |
ТЫ | Windows , macOS , Linux |
Лицензия | Лицензия Апач 2.0 |
Расширения имен файлов | .pyx, .pxd, .pxi [4] |
Веб-сайт | цитон |
Под влиянием | |
С , Питон |
Cython ( / ˈ s aɪ θ ɒ n / ) — это надмножество языка программирования Python сравнимую с производительностью C. , которое позволяет разработчикам писать код Python (с дополнительными синтаксическими расширениями, основанными на C), который обеспечивает производительность , [5] [6]
Cython — это компилируемый язык , который обычно используется для создания модулей расширения CPython . Аннотированный Python-подобный код компилируется в C, а затем автоматически оборачивается кодом интерфейса , создавая модули расширения, которые можно загружать и использовать обычным кодом Python с помощью оператора импорта, но со значительно меньшими вычислительными затратами во время выполнения . Cython также облегчает упаковку независимого кода C или C++ в модули, импортируемые в Python.
Cython написан на Python и C и работает в Windows , macOS и Linux , создавая исходные файлы C, совместимые с CPython 2.6, 2.7, 3.3 и более поздних версий. Исходный код Cython, который Cython компилирует (в C), может использовать синтаксис Python 2 и Python 3, по умолчанию используется синтаксис Python 2 в Cython 0.x (и синтаксис Python 3 в Cython 3.x). Значение по умолчанию можно переопределить (например, в комментарии к исходному коду) на синтаксис Python 3 (или 2). Поскольку синтаксис Python 3 изменился в последних версиях, Cython может быть не в курсе последних дополнений. Cython имеет «встроенную поддержку большей части языка C++» и «компилирует почти весь существующий код Python». [7]
Cython 3.0.0 был выпущен 17 июля 2023 года. [8]
Дизайн
[ редактировать ]Cython работает, создавая стандартный модуль Python. Однако его поведение отличается от стандартного Python тем, что код модуля, изначально написанный на Python, транслируется на C. Хотя полученный код работает быстро, он выполняет множество вызовов интерпретатора CPython и стандартных библиотек CPython для выполнения реальной работы. Выбор этого варианта значительно сэкономил время разработки Cython, но модули зависят от интерпретатора Python и стандартной библиотеки.
Хотя большая часть кода основана на C, обычно требуется небольшой загрузчик-заглушка, написанный на интерпретируемом Python (если только целью не является создание загрузчика, полностью написанного на C, что может включать работу с недокументированными внутренними компонентами CPython). Однако это не является серьезной проблемой благодаря наличию интерпретатора Python. [9]
Cython имеет внешний интерфейс функций для вызова C / C++ подпрограмм и возможность объявлять статический тип параметров и результатов подпрограмм, локальных переменных и атрибутов класса.
Программа Cython, реализующая тот же алгоритм, что и соответствующая программа Python, может потреблять меньше вычислительных ресурсов, таких как основная память и циклы обработки, из-за различий между моделями выполнения CPython и Cython. Базовая программа Python загружается и выполняется виртуальной машиной CPython , поэтому как среда выполнения, так и сама программа потребляют вычислительные ресурсы. Программа Cython компилируется в код C, который затем компилируется в машинный код, поэтому виртуальная машина используется лишь кратковременно при загрузке программы. [10] [11] [12] [13]
В компании Cython работают:
- Оптимистичные оптимизации
- Вывод типа (необязательно)
- Низкие накладные расходы в структурах управления
- Низкие накладные расходы на вызов функций [14] [15]
Производительность зависит как от того, какой код C генерирует Cython, так и от того, как этот код компилируется компилятором C. [16]
История
[ редактировать ]Cython — производное от языка Pyrex , но он поддерживает больше функций и оптимизаций, чем Pyrex. [17] [18] Cython был отделен от Pyrex в 2007 году разработчиками пакета компьютерной алгебры Sage , поскольку они были недовольны ограничениями Pyrex и не могли получить исправления, принятые сопровождающим Pyrex Грегом Юингом, который предполагал гораздо меньшие возможности для своего инструмента, чем разработчики Sage в разум. Затем они создали форк Pyrex как SageX. Когда они обнаружили, что люди загружают Sage только для того, чтобы получить SageX, а разработчики других пакетов (включая Стефана Бенеля, который поддерживает XML- библиотеку LXML) также поддерживают вилки Pyrex, SageX был отделен от проекта Sage и объединен с cython-lxml
стать Китоном. [19]
Файлы Cython имеют .pyx
расширение. По своей сути код Cython выглядит точно так же, как код Python. Однако, в то время как стандартный Python является динамически типизированным , в Cython типы могут быть предоставлены опционально, что позволяет повысить производительность и преобразовать циклы в циклы C, где это возможно. Например:
# The argument will be converted to int or raise a TypeError.
def primes(int kmax):
# These variables are declared with C types.
cdef int n, k, i
# Another C type
cdef int p[1000]
# A Python type
result = []
if kmax > 1000:
kmax = 1000
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % p[i] != 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
return result
Пример
[ редактировать ]
Пример программы hello world для Cython более сложен, чем на большинстве языков, поскольку он взаимодействует с API Python C и setuptools
или другие PEP517 . объекты расширения, соответствующие [ жаргон ] Для базового проекта требуется как минимум три файла:
- А
setup.py
файл для вызоваsetuptools
процесс сборки, который генерирует модуль расширения - Основная программа Python для загрузки модуля расширения.
- Исходный файл(ы) Cython
Следующие листинги кода демонстрируют процесс сборки и запуска:
# hello.pyx - Python module, this code will be translated to C by Cython.
def say_hello():
print("Hello World!")
# launch.py - Python stub loader, loads the module that was made by Cython.
# This code is always interpreted, like normal Python.
# It is not compiled to C.
import hello
hello.say_hello()
# setup.py - unnecessary if not redistributing the code, see below
from setuptools import setup
from Cython.Build import cythonize
setup(name = "Hello world app",
ext_modules = cythonize("*.pyx"))
Эти команды собирают и запускают программу:
$ python setup.py build_ext --inplace
$ python launch.py
Использование в блокноте IPython/Jupyter
[ редактировать ]Более простой способ начать работу с Cython — использовать IPython из командной строки (или через консоль Python в браузере, называемую Jupyter Notebook ):
In [1]: %load_ext Cython
In [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
...: for i in range(n):
...: a += i
...: return a
...:
In [3]: %timeit f(1000000)
10 loops, best of 3: 26.5 ms per loop
In [4]: %timeit g(1000000)
1000 loops, best of 3: 279 µs per loop
что дает улучшение в 95 раз по сравнению с версией на чистом Python. Более подробную информацию по этому вопросу можно найти на официальной странице быстрого запуска. [20]
Использование
[ редактировать ]Cython особенно популярен среди научных пользователей Python. [12] [21] [22] где у него «идеальная аудитория», по словам создателя Python Гвидо ван Россума . [23] Особо следует отметить:
- Бесплатная система компьютерной алгебры SageMath зависит от Cython как по производительности, так и по интерфейсу с другими библиотеками. [24]
- Значительные части библиотек научных вычислений SciPy , pandas и scikit-learn написаны на Cython. [25] [26]
- Некоторые веб-сайты с высоким трафиком, такие как Quora, используют Cython. [ нужен лучший источник ] [27]
Область применения Cython не ограничивается только численными вычислениями. Например, набор инструментов lxml XML написан в основном на Cython, и, как и его предшественник Pyrex, Cython используется для предоставления привязок Python для многих библиотек C и C++, таких как библиотека обмена сообщениями ZeroMQ . [28] Cython также можно использовать для разработки параллельных программ для с многоядерными процессорами машин ; эта функция использует библиотеку OpenMP .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Бенель, Стефан (2008). «Компилятор Cython для C-расширений в Python» . EuroPython (28 июля 2007 г.: официальный запуск Cython). Вильнюс/Летува.
- ^ «Выпуск 3.0.10» . 30 марта 2024 г. Проверено 22 апреля 2024 г.
- ^ Журнал изменений Cython , cython, 15 мая 2023 г. , получено 19 мая 2023 г.
- ^ «Основы языка — документация Cython 3.0.0a9» . cython.readthedocs.io . Проверено 9 сентября 2021 г.
- ^ «Cython — обзор — Документация Cython 0.19.1» . Docs.cython.org . Проверено 21 июля 2013 г.
- ^ Смит, Курт (2015). Cython: Руководство для программистов Python . О'Рейли Медиа . ISBN 978-1-4919-0155-7 .
- ^ «Часто задаваемые вопросы · cython/cython Wiki» . Гитхаб . Проверено 11 января 2023 г.
- ^ «Журнал изменений Cython» . cython.org . Проверено 21 июля 2023 г.
- ^ «Базовое руководство — документация Cython 3.0a6» . cython.readthedocs.io . Проверено 11 декабря 2020 г.
- ^ Олифант, Трэвис (20 июня 2011 г.). «Техническое открытие: ускорение Python (NumPy, Cython и Weave)» . Technicaldiscovery.blogspot.com . Проверено 21 июля 2013 г.
- ^ Бенель, Стефан; Брэдшоу, Роберт; Ситро, Крейг; Дальчин, Лисандро; Сельеботн, Даг Сверре; Смит, Курт (2011). «Ситон: лучшее из обоих миров» . Вычисления в науке и технике . 13 (2): 31–39. Бибкод : 2011CSE....13b..31B . дои : 10.1109/MCSE.2010.118 . hdl : 11336/13103 . S2CID 14292107 .
- ^ Jump up to: а б Сельебот, Даг Сверре (2009). «Быстрые численные вычисления с Cython» . Материалы 8-й конференции «Питон в науке» (SciPy 2009) : 15–22.
- ^ Уилберс, И.; Лангтанген, HP; Эдегард, О. (2009). Скаллеруд, Б.; Андерссон, Хай (ред.). «Использование Cython для ускорения числовых программ на Python» . Труды MekIT'09 : 495–512. Архивировано из оригинала (PDF) 4 января 2017 года . Проверено 14 июня 2011 г.
- ^ «тесты оболочек для нескольких генераторов оболочек Python (кроме Cython)» . Архивировано из оригинала 4 апреля 2015 года . Проверено 28 мая 2010 г.
- ^ «тесты оболочек для Cython, Boost.Python и PyBindGen» . Архивировано из оригинала 3 марта 2016 года . Проверено 28 мая 2010 г.
- ^ «Cython: C-расширения для Python» . Проверено 22 ноября 2015 г.
- ^ «Различия между Цитоном и Пирексом» . Гитхаб .
- ^ Юинг, Грег (21 марта 2011 г.). «Re: Информация о саммите VM и Language для тех, кто не в Pycon (и тех, кто там!)» (Сообщение в электронный список рассылки
python-dev
) . Проверено 5 мая 2011 г. - ^ Говорит разработчик Sage и Cython Роберт Брэдшоу на конференции Sage Days 29 (22 марта 2011 г.). «Ситон: прошлое, настоящее и будущее» . Архивировано из оригинала 21 декабря 2021 года . Проверено 5 мая 2011 г. - через YouTube .
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ «Создание кода Cython» . cython.readthedocs.io . Проверено 24 апреля 2017 г. .
- ^ «inSCIght: Подкаст по научным вычислениям» (серия 6). Архивировано из оригинала 10 октября 2014 года . Проверено 29 мая 2011 г.
- ^ Миллман, Джаррод; Айвазис, Михаил (2011). «Python для ученых и инженеров» . Вычисления в науке и технике . 13 (2): 9–12. Бибкод : 2011CSE....13b...9M . дои : 10.1109/MCSE.2011.36 .
- ^ Гвидо Ван Россум (21 марта 2011 г.). «Re: Информация о саммите VM и Language для тех, кто не в Pycon (и тех, кто там!)» (Сообщение в электронный список рассылки
python-dev
) . Проверено 5 мая 2011 г. - ^ Эрокал, Бурчин; Штейн, Уильям (2010). «Проект Sage: объединение бесплатного математического программного обеспечения для создания жизнеспособной альтернативы Magma, Maple, Mathematica и MATLAB». Математическое программное обеспечение – ICMS 2010 (PDF) . Конспекты лекций по информатике. Том. 6327. Шпрингер Берлин/Гейдельберг. стр. 12–27. CiteSeerX 10.1.1.172.624 . дои : 10.1007/978-3-642-15582-6_4 . ISBN 978-3-642-15581-9 .
{{cite book}}
:|journal=
игнорируется ( помогите ) - ^ «Примечания к выпуску SciPy 0.7.2» . Архивировано из оригинала 4 марта 2016 года . Проверено 29 мая 2011 г.
- ^ Педрегоса, Фабиан; Варокво, Гаэль; Грамфор, Александр; Мишель, Винсент; Тирион, Бертран; Гризель, Оливье; Блондель, Матье; Преттенхофер, Питер; Вайс, Рон; Дюбур, Винсент; Вандерплас, Джейк; Пассос, Александр; Курнапо, Дэвид (2011). «Scikit-learn: машинное обучение на Python». Журнал исследований машинного обучения . 12 :28:25–28:30. arXiv : 1201.0490 . Бибкод : 2011JMLR...12.2825P .
- ^ «Quora все еще работает на PyPy?» .
- ^ «ØMQ: привязка Python» .