超越 Python#

这是一系列关于包含用非 Python 语言编写的代码的想法。目前,我们唯一有额外文档说明的非 Python 语言选项是 Cython

我可以使用除 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

spin build -d

现在,您可以运行

gdb --args spin python mytest.py

如果您之前没有启用调试符号进行编译,请先删除 build 目录。在调试器中

(gdb) break cephes_hyp2f1
(gdb) run

执行现在将停止在相应的 C 函数处,您可以像往常一样逐步执行它。除了普通的 gdb 之外,您当然可以使用您最喜欢的替代调试器;在 python 二进制文件上运行它,参数为 spin python mytest.py