超越 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 生成的用户定义函数,参见 ndimage-ccallbacks。
如何在 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
。