【发布时间】:2019-01-27 23:32:15
【问题描述】:
在 Python 中,我有一个列表列表作为输入:
input = [[0,1,2],[0,3,4,5],[0,6]]
实际上,子列表的数量是数万个。每个子列表的长度可以变化很大,从零或一个值到数百个。
我想将输入数据作为一些 2D 结构传递给将处理它的 Cython 模块。我希望在多核上处理数据,因此我使用prange 和nogil=True:
from cython.parallel import prange
cpdef int my_func(long[:,:] arr):
cdef int i,j
for i in prange(arr.shape[0], nogil=True):
for j in range(arr.shape[1]):
# Do something
pass
return 42
我看到以下解决方案:
- 将列表列表放入 2D ndarray。但是由于每个子列表的长度变化很大,ndarray并不是一个理想的数据结构
- 修改
my_func以接受列表列表。问题是部分代码在没有 GIL 的情况下执行,因此无法访问 python 对象。
有没有人有关于如何解决这个问题的建议,最好是代码?
【问题讨论】:
-
@mathiash 得到了 cdef 类向量的解决方案? vector 是 nogil,cdef 类也可以是 nogil,但是 vector 不接受模板中的 cdef 类
标签: python multiprocessing cython gil