超越 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 生成的使用者定義函數的程式碼,請參閱 Extending scipy.ndimage in C。
我該如何在 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.py
的 python
二進制檔案上運行它。