Cython:如何在不需要 GIL 的情况下从 numpy 内存视图转到矢量[对[双,双]]?

Cython: how to go from numpy memory view to vector[pair[double,double]] without needing the GIL?

本文关键字:视图 内存 不需要 GIL numpy 情况下 Cython      更新时间:2023-10-16

我正在尝试将Cython代码中的所有Python调用转换为纯C,以便能够释放GIL并进行并行化。

我曾经使用从 2D numpy 数组初始化的大小 2 列表列表,所以我做了类似的事情:

cdef double[:,:,:] init=np.random.uniform((10,4,2),dtype=np.float32)
cdef int i
cdef int N=init.shape[0]
for i in range(N):
a=init[i].tolist()
#I then get this list of list 
#a=[[1.,1.],[1.,1.],[1.,1.]]
#f acting on list of list
f(a)

我需要在循环中释放 GIL,所以我需要删除对 Python 的所有调用。通过使用向量[对[双精度,双倍]]而不是列表并相应地修改f,我现在有:

cdef vector[pair[double,double]] a 
cdef double[:,:,:] init=np.ones((10,4,2),dtype=np.float32_t)
cdef int i
cdef int N=init.shape[0]
for i in prange(N):
#I need to get a vector[pair[double,double]] from the numpy init[i]
#with f now cdef acting on vector[pair[double,double]]
a=np.asarray(init[i]) #actually works but it goes through Python !
f(a)

如何在不通过python的情况下将init[i](因此是double[:,:]类型(转换为向量[pair[double,double]]?

我认为没有任何解决方案可以在不使用 GIL 的情况下从 memoryview 甚至 numpy 转到std::vector。我找到的唯一解决方案是首先将大数组转换为vector[vector[pair[double,double]]],然后您可以在没有 GIL 的情况下访问它,在一秒钟内进行所有密集计算。