超越 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 dev.py python mytest.pypython 二进制文件上运行它。