2017-08-21 59 views
2

我要釋放的GIL內部for循環三維numpy的陣列用Cython與numpy的如何擺脫花哨的索引(到Python沒有呼叫)

cdef np.ndarray[DTYPE_t,ndim=3] array=np.ones((10000000,4,2)) 
cdef np.ndarray[DTYPE_t,ndim=2] sliced_array 
cdef int i 
cdef int N=array.shape[0] 
for i in range(N): 
    sliced_array=array[i] 
    #perform computations on slice 

。當我看到生成的HTML通過Cython,它看起來像是在調用Python時它正在做sliced_array=array[i]我想這是因爲它推斷了另外兩個尺寸的大小,但即使使用第二和第三軸的輸入範圍,這行仍然是黃色的!

sliced_array=array[i,typed_slice_x,typed_slice_y] 
+0

我沒有使用Cython,但'slice'是一個Python內置函數,這可能會導致問題。 –

+0

你是什麼意思? – jean

+0

嘗試重命名該變量。 –

回答

4

一個在宣佈事情numpy的數組新memoryview語法的好處是,你可以做索引操作沒有GIL:

cdef double[:,:,:] array=np.ones((10000000,4,2)) 
cdef double[:,:] sliced_array 
cdef int i 
cdef int N=array.shape[0] 
for i in range(N): 
    with nogil: # just to prove the point 
    sliced_array=array[i,:,:] 

如果聲明爲cdef np.ndarray,那麼你可以」很容易避免需要GIL進行索引。

+0

好的再次感謝@DavidW我需要買一本關於Python的書,看起來我真的需要更多地瞭解一下Python如何在內部工作,而不是被困在每個該死的時間。 – jean