簡體   English   中英

Cython 用零初始化矩陣

[英]Cython initialize matrix with zeros

描述

我只是想創建一個由0填充的rows x cols的矩陣。 總是使用 numpy 我認為使用文檔中描述np.zeros是最簡單的:

DTYPE = np.int
ctypedef np.int_t DTYPE_t

def f1():
    cdef:
        int dim = 40000
        int i, j
        np.ndarray[DTYPE_t, ndim=2] mat = np.zeros([40000, 40000], dtype=DTYPE)
        
    for i in range(dim):
        for j in range(dim):
            mat[i, j] = 1

然后我使用 c 中的數組進行了比較:

def f2():
    cdef:
        int dim = 40000
        int[40000][40000] mat
        int i, j
    
    for i in range(dim):
        for j in range(dim):
            mat[i][j] = 1

numpy 版本在我的電腦上用了3 secs ,而 c 版本只用了2.4e-5 secs 但是,當我從f2()返回數組時,我注意到它不是零填充的(當然這里不能, i==j但是當不填充它時,它也不會返回 0 數組)。 如何在 cython 中做到這一點。 我知道在常規 C 中它會像: int arr[n][m] = {}; .

問題

如何用0s填充 c 數組? (如果我的代碼中有明顯錯誤,我會選擇 numpy)

你不想寫這樣的代碼:

  1. int[40000][40000] mat在堆棧上生成一個 6 GB 的數組(假設為 4 字節整數)。 通常,最大堆棧大小約為幾 Mb。 我不知道這不會使您的 PC 崩潰。

  2. 但是,當我從 f2() 返回數組時 [...]

    您分配的數組完全是函數本地的。 從 C 的角度來看,您無法返回它,因為它在函數完成后不再存在。 我認為 Cython 可能會為您將其轉換為(嵌套的)Python 列表。 這需要逐個元素的慢速復制,這不是您想要的。

對於您在這里所做的事情,僅使用 Numpy 會更好


Cython 不支持 C arr = {}的良好等效項,因此如果您確實想要初始化合理的小型 C 數組,則需要使用一個:

  1. 循環,
  2. memset (您可以從cimport libc.string ),
  3. 創建它的類型化內存視圖並執行memview[:,:] = 0

numpy 版本在我的電腦上用了 3 秒,而 c 版本只用了 2.4e-5 秒。

這種差異通常表明 C 編譯器已經優化了一些代碼(通過檢測結果未使用)。 這不太可能是真正的加速。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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