Cython:如何从numpy内存视图转到vector [pair [double,double]]而不需要GIL?

时间:2017-08-21 14:03:43

标签: c++ numpy cython

我正在尝试将我的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?

1 个答案:

答案 0 :(得分:0)

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