За пределами Python#

Это небольшая коллекция мыслей, связанных с включением кода, написанного на языках, отличных от Python. В настоящее время единственный вариант для языков, отличных от Python, для которых у нас есть дополнительная документация, это Cython.

Могу ли я использовать язык программирования, отличный от Python, чтобы ускорить мой код?

Да. Языки, используемые в SciPy: Python, Cython, Pythran, C, C++ и Fortran. У каждого есть свои плюсы и минусы. Если Python действительно не обеспечивает достаточную производительность, можно использовать один из этих языков. Важные аспекты при использовании компилируемых языков — поддерживаемость и переносимость. Для поддерживаемости предпочтительнее Pythran и Cython, чем C/C++/Fortran. Cython, C и C++ более переносимы, чем Fortran. Многие существующие коды на Fortran в SciPy — это старые, проверенные коды, которые были только обёрнуты в (но не специально написаны для) Python/SciPy.

Наш основной совет: используйте Pythran или Cython для ускорения небольших фрагментов кода. В случаях, когда Pythran или Cython уже недостаточно, предпочтительнее C или C++. Если есть конкретные причины, по которым предпочтительнее Fortran, сначала обсудите эти причины.

Могу ли я использовать Numba?

Пока нет, но мы рассматриваем это на будущее. Можно написать код, который принимает пользовательские функции, сгенерированные Numba, см. Расширение scipy.ndimage на C.

Как отлаживать код, написанный на C/C++/Fortran внутри SciPy?

Самый простой способ сделать это — сначала написать скрипт на Python, который вызывает C-код, выполнение которого вы хотите отладить. Например mytest.py:

from scipy.special import hyp2f1
print(hyp2f1(5.0, 1.0, -1.8, 0.95))

Сборка SciPy в режиме отладки:

python dev.py build -d

Теперь вы можете запустить:

gdb --args python dev.py python mytest.py

Если вы ранее не компилировали с включенными отладочными символами, удалите build сначала каталог. В отладчике:

(gdb) break cephes_hyp2f1
(gdb) run

Выполнение теперь остановится на соответствующей функции C, и вы сможете пошагово пройти через нее как обычно. Вместо простого gdb вы можете, конечно, использовать ваш любимый альтернативный отладчик; запустите его на python binary с аргументами python dev.py python mytest.py.