我正在尝试将我的Cython代码中的所有Python调用转换为纯C,以便能够释放GIL并进行并行化。
我曾经使用从2D numpy数组初始化的list-of-size-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的所有调用。通过使用vector [pair [double,double]]而不是list并相应地修改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)
如何将init [i](因此是双[:,]]类型转换为向量[pair [double,double]]而不通过python?
答案 0 :(得分:0)
我认为在没有使用GIL的情况下,从memoryview甚至numpy到std::vector
都没有任何解决方案。我找到的唯一解决方案是首先将大数组转换为vector[vector[pair[double,double]]]
,然后您可以在第二个for循环中访问它而不使用GIL,您将进行所有密集计算。