Вступление
CPython - наиболее распространенная и широко используемая реализация Python. Обычно, когда разработчики ссылаются на Python, они имеют в виду реализацию Python или CPython на языке C. Есть и другие реализации Python, вот список прямо с Python.org.
1. IronPython (Python, работающий на .NET)
2. Jython (Python, работающий на виртуальной машине Java)
3. PyPy (быстрая реализация python с JIT-компилятором)
4. Stackless Python (ветвь CPython, поддерживающая микропотоки)
5. MicroPython (Python, работающий на микроконтроллерах)
Есть несколько способов ускорить CPython, от методов компиляции на основе JIT до написания расширений C для Python, и мы собираемся изучить последний.
Что такое Cython?
Cython - это язык программирования, который стремится стать надмножеством Python, с Cython можно писать расширения C для языка Python, будучи столь же читаемыми и доступными, как Python. Cython быстр и в то же время обеспечивает гибкость объектно-ориентированного, функционального и динамического языка программирования. Один из ключевых аспектов Cython - это необязательные объявления статических типов, которые появляются из коробки. Исходный код переводится в оптимизированный код C / C ++ и компилируется как модули расширения Python.
Это обеспечивает как очень быстрое выполнение программы, так и тесную интеграцию с внешними библиотеками C, сохраняя при этом высокую производительность программиста, которой хорошо известен язык Python.
Давайте протестируем ускорение Cython с помощью старой доброй программы из учебника CS - найдем последовательность Фибоначчи с точностью до целого числа, заданного пользователем.
Код -
Версия Python:
def fibonaci_series(n: int): i = 0 a = 1 b = 1 fib = [] fib.append(a) fib.append(b) while i < n: c = a + b fib.append(c) a = b b = c i += 1 return fib
Cython-ized версия:
cpdef list fibonaci_series(int n): cdef int i = 0 cdef int a = 1 cdef int b = 1 cdef int c = 0 cdef list fib = [] fib.append(a) fib.append(b) while i < n: c = a + b fib.append(c) a = b b = c i += 1 return fib
В приведенном выше примере синтаксически единственное различие состоит в том, что Cython использует статическую типизацию (точно так же, как это делается в C / C ++ / Go или другом статически типизированном языке). Ключом является статическая типизация для ускорения, хотя Cython довольно снисходителен с точки зрения деклараций по сравнению с C / C ++, можно было бы просто написать чистый синтаксис Python в Cython (вы также не заметите большой скорости вверх ... ну!)
Вы сказали, что выполнили?
Да, вам нужно скомпилировать код Cython.
- Шаг 1 - Напишите свой код Cython в файле * .pyx
- Шаг 2 - В вашем main.py или app.py (независимо от того, какой файл вы используете в качестве точки входа) напишите -
import pyximport pyximport.install(build_dir=”./build”)
Это создаст файлы сборки * .pyx вместе с перенесенным кодом в файл C с расширением * .c, это фактический код C (более ~ 2750 строк в нашем случае)! Не волнуйтесь, он генерируется транспилером Cython и оптимизирован для той цели, с которой вы его написали (довольно круто, не так ли!?)
- Шаг 3. Запустите вашу программу, как если бы вы запускали обычный код Python.
Результаты тестов -
Cython без статической типизации
python run_test.py 10000 Python test took 4.7995266050000005 secs Cython test took 3.575472554000001 secs Cython speed up over Python : 1.3423474890418636 times
Cython со статической типизацией
python run_test.py 10000 Python test took 4.829826579 secs Cython test took 0.28026456299999936 secs Cython speed up over Python : 17.233097639247422 times
Отказ от ответственности: обратите внимание, что тесты основаны на логике, полностью написанной с использованием примитивов Python, код не зависит от сторонних библиотек. Результаты могут отличаться в зависимости от базовой библиотеки / фреймворка и структуры кода.
Когда я буду использовать Cython?
Большинство библиотек для Python, требующих высокой производительности, написаны на Cython, C / C ++.
Некоторые библиотеки Cython (и их много…)
- Numpy (числовые вычисления)
- Scipy (научные вычисления)
- Scikit-Learn (библиотека машинного обучения)
- Pandas (анализ данных)
- Spacy (естественный язык производственного уровня Набор инструментов обработки (NLP))
Это некоторые предварительные варианты использования Cython, я обычно использую Cython для ускорения циклов и условных выражений [for, while, if else и т. Д.] (Да, это низко висящий плод)
Возможные альтернативы Cython
Хотя Cython имеет хорошую совместимость с экосистемой CPython, необходимо переписать реализацию Python, поскольку она вводит новый синтаксис и другой подход к программированию на Python, разработчик может время от времени чувствовать себя перегруженным (по крайней мере, я читал некоторый продвинутый код Cython) .
Mypy - это необязательная программа проверки статического типа для Python (использует аннотации типов в Python 3.6 и более поздних версиях), Mypyc, с другой стороны, стремится создать расширение C из кода с проверкой типа mypy.
Все это звучит великолепно, но проект все еще находится в зачаточном состоянии, и его еще нельзя использовать для производства, внимательно следите за проектом, если вам интересно, я знаю, что буду :-)
2. Нумба
Ну, Numba использует совершенно другой подход, он использует методы JIT-компиляции и инфраструктуру LLVM для ускорения работы. Numba больше подходит для кода на основе Numpy, поскольку он оптимизирован и построен специально для научных вычислений.
Нам нужно углубиться в понимание этих подходов, это выходит за рамки данной статьи (может быть, в другой раз).
Где мне найти исходный код демонстрации?
Вот ссылка на репозиторий Github для этой статьи.
Что дальше?
Я рассмотрел, возможно, менее процента того, что вы могли бы сделать с Cython. Возможно, я пропустил некоторые аспекты Cython, такие как запуск Cython на ноутбуке Jupyter, я настоятельно рекомендую вам прочитать официальную документацию.
Я перечислил несколько ссылок в разделе ресурсов, которые вы можете изучить, не стесняйтесь делиться своими мыслями.