超越 Python#
这是一个关于包含用 Python 以外的语言编写的代码的想法的小集合。目前,我们只有关于 Cython 的额外文档,它是我们支持的除 Python 之外的唯一语言。
我可以使用除 Python 之外的编程语言来加速我的代码吗?
可以。SciPy 中使用的语言是 Python、Cython、Pythran、C、C++ 和 Fortran。所有这些都有其优缺点。如果 Python 确实无法提供足够的性能,可以使用这些语言中的任何一种。使用编译语言时需要考虑的重要问题是可维护性和可移植性。为了可维护性,Pythran 和 Cython 比 C/C++/Fortran 更受欢迎。Cython、C 和 C++ 比 Fortran 更具可移植性。SciPy 中许多现有的 Fortran 代码是较旧的、经过实战检验的代码,这些代码只是被包装在 (但不是专门为) Python/SciPy 编写的。
我们的基本建议是:使用 Pythran 或 Cython 来加速较小的代码片段。如果 Pythran 或 Cython 不再足够,优先选择 C 或 C++。如果出于特定原因更喜欢 Fortran,请先讨论这些原因。
我可以使用 Numba 吗?
目前还不行,但我们正在考虑在未来将其纳入。可以编写接受由 Numba 生成的用户定义函数的代码,请参阅 用 C 扩展 scipy.ndimage。
如何调试在 SciPy 中用 C/C++/Fortran 编写的代码?
最简单的方法是先编写一个 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
二进制文件上运行它,参数为 python dev.py python mytest.py
。