簡體   English   中英

Cython:在純 Python 模式下有效使用 Numpy

[英]Cython: Effectively using Numpy in Pure Python Mode

我對使用 Cython 還很陌生,我對使用“純 Python”模式很感興趣。

我現在正在做的工作廣泛使用 numpy,並且知道 numpy 有一個 C api,我很高興看到它可以做什么。

作為一個小測試,我將兩個小測試文件放在一起, test.pytest.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM