Cython与NumPy如何摆脱花式索引(无需调用Python)

3

我想在一个三维的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时,当它执行sliced_array=array[i]时,它似乎在调用Python。我猜这是因为它推断出了另外两个维度的大小,但即使对第二和第三轴使用了类型化范围,这行代码仍然是黄色的!

sliced_array=array[i,typed_slice_x,typed_slice_y]

我没有使用过Cython,但是slice是Python内置的函数,这可能会导致问题。 - Kirill Bulygin
你是什么意思? - jeandut
尝试重新命名变量。 - Kirill Bulygin
不,不是那样的。 - jeandut
但是还是很好的发现。 - jeandut
1个回答

5
较新的memoryview语法相对于声明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。

1
好的,再次感谢@DavidW。我需要购买一本关于Python的书籍,似乎我真的需要更多地了解Python内部的工作方式,以免每次都被卡住。 - jeandut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接