[英]Cython: Effectively using Numpy in Pure Python Mode
我對使用 Cython 還很陌生,我對使用“純 Python”模式很感興趣。
我現在正在做的工作廣泛使用 numpy,並且知道 numpy 有一個 C api,我很高興看到它可以做什么。
作為一個小測試,我將兩個小測試文件放在一起, test.py
和test.pxd
。 它們的內容如下:
測試.py:
import cython
import numpy as np
@cython.locals(array=np.ndarray)
@cython.returns(np.ndarray)
def test(array):
return np.cumsum(array)
test_array = np.array([1,2,3,4,5])
test(test_array)
測試.pxd:
# cython: language_level=3
cimport numpy as np
cdef np.ndarray test(np.ndarray array)
然后我用cython -a test.py
編譯了這些文件,希望在調用 np.cumsum() 時幾乎看不到 python 交互。 但是,當我檢查生成的 HTML 文件時,我發現了以下內容:
由此看來,我對 np.cumsum 的調用似乎與 python 有很大的交互,這有點違反直覺。 我的期望,因為我(應該)使用 cimported numpy,應該有很少的 python 交互。
我的問題是“我的直覺是否正確?”。 我是否對我的文件進行了錯誤設置,不允許 cimported numpy 實際用於函數調用,這就是為什么我仍然看到這么多黃色? 或者我從根本上誤解了什么。
謝謝閱讀!
將類型定義為np.ndarray
主要改進了一件事:它使索引它們以更快地獲得單個值。 幾乎所有其他東西都保持相同的速度。
np.cumsum
(和任何其他 Numpy 函數)通過標准 Python 機制調用並以完全相同的速度運行(當然它在內部是用 C 實現的,應該很快)。 數學運算符(如加+, -, *, etc.
)也通過 Python 調用並保持相同的速度。
實際上,您的包裝可能會使其變慢 - 它增加了不必要的類型檢查(以確保數組是np.ndarray
)和額外的間接層。
在這里打字沒有任何好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.