首先,为我的英语不太好而道歉。
我想,我的问题很容易解释。
result={}
list_tuple=[(float,float,float),(float,float,float),(float,float,float)...]#200k tuples
threshold=[float,float,float...] #max 1k values
for tuple in list_tuple:
for value in threeshold:
if max(tuple)>value and min(tuple)<value:
if value in result:
result[value].append(tuple)
else:
result[value]=[]
result[value].append(tuple) list_tuple包含大约200k个元组,我必须非常快地完成这个操作(在普通pc上最多2/3秒)。
我的第一个尝试是在cython中使用prange() (这样我就可以从cython优化和并行执行中受益),但问题是(像往常一样),GIL:在prange()中,我可以使用cython memviews管理列表和元组,但不能将结果插入到dict中。
在cython中,我也尝试使用c++标准的unordered_map,但现在的问题是,我不能在c++中生成数组的向量(这就是我的判断值)。
第二个问题与此类似:
list_tuple=[((float,float),(float,float)),((float,float),(float,float))...]#200k tuples of tuples
result={list_tuple[0][0]:[]}
for tuple in list_tuple:
if tuple[0] in result:
result[tuple[0]].append(tuple)
else:
result[tuple[0]]=[]这里我还有另一个问题,如果想要使用prange(),我必须使用一个自定义的散列函数来使用一个数组作为c++ unordered_map的键
正如你所看到的,我的代码片段很容易并行运行。
我想尝试使用numba,但由于GIL,我更喜欢使用cython,因为我需要一个二进制代码(这个库可以是商业软件的一部分,所以只允许使用二进制库)。
一般来说,我希望避免使用c/c++函数,我希望找到一种方法来并行管理像字典/列表这样的东西,同时保持cython的性能,尽可能多地保留在Python域中;但我愿意接受任何建议。
谢谢
https://stackoverflow.com/questions/51558415
复制相似问题