За пределами 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.