Вступление

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) .

1. MyPy и MyPyC

Mypy - это необязательная программа проверки статического типа для Python (использует аннотации типов в Python 3.6 и более поздних версиях), Mypyc, с другой стороны, стремится создать расширение C из кода с проверкой типа mypy.

Все это звучит великолепно, но проект все еще находится в зачаточном состоянии, и его еще нельзя использовать для производства, внимательно следите за проектом, если вам интересно, я знаю, что буду :-)

2. Нумба

Ну, Numba использует совершенно другой подход, он использует методы JIT-компиляции и инфраструктуру LLVM для ускорения работы. Numba больше подходит для кода на основе Numpy, поскольку он оптимизирован и построен специально для научных вычислений.

Нам нужно углубиться в понимание этих подходов, это выходит за рамки данной статьи (может быть, в другой раз).

Где мне найти исходный код демонстрации?

Вот ссылка на репозиторий Github для этой статьи.

Что дальше?

Я рассмотрел, возможно, менее процента того, что вы могли бы сделать с Cython. Возможно, я пропустил некоторые аспекты Cython, такие как запуск Cython на ноутбуке Jupyter, я настоятельно рекомендую вам прочитать официальную документацию.

Я перечислил несколько ссылок в разделе ресурсов, которые вы можете изучить, не стесняйтесь делиться своими мыслями.

Ресурсы -

  1. Альтернативы Python
  2. Документация Cython
  3. Mypyc или компилятор mypy
  4. Mypy github
  5. Mypy docs
  6. Pyjion - JIT-компилятор на базе CoreCLR
  7. Написание C на Cython (Статья создателей Spacy)