[英]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)
你不想寫這樣的代碼:
int[40000][40000] mat
在堆棧上生成一個 6 GB 的數組(假設為 4 字節整數)。 通常,最大堆棧大小約為幾 Mb。 我不知道這不會使您的 PC 崩潰。
但是,當我從 f2() 返回數組時 [...]
您分配的數組完全是函數本地的。 從 C 的角度來看,您無法返回它,因為它在函數完成后不再存在。 我認為 Cython 可能會為您將其轉換為(嵌套的)Python 列表。 這需要逐個元素的慢速復制,這不是您想要的。
對於您在這里所做的事情,僅使用 Numpy 會更好。
Cython 不支持 C arr = {}
的良好等效項,因此如果您確實想要初始化合理的小型 C 數組,則需要使用一個:
memset
(您可以從cimport
libc.string
),memview[:,:] = 0
numpy 版本在我的電腦上用了 3 秒,而 c 版本只用了 2.4e-5 秒。
這種差異通常表明 C 編譯器已經優化了一些代碼(通過檢測結果未使用)。 這不太可能是真正的加速。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.