Cython与numpy如何摆脱花哨的索引(没有调用Python)

时间:2017-08-21 15:11:30

标签: python numpy cython

我想在一个三维numpy数组的for循环中释放GIL

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

当我查看Cython生成的html时,看起来它正在调用Python sliced_array=array[i]我想这是因为它推断了其他两个维度的大小,但即使使用类型化的范围也是如此第二和第三轴这条线仍然是黄色的!

sliced_array=array[i,typed_slice_x,typed_slice_y]

1 个答案:

答案 0 :(得分:4)

较新的memoryview语法优于将numpy数组声明为numpy数组的一个优点是,您可以在没有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进行索引。