超越 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

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