对不起,如果这个问题对你来说太过火了。我参加了编程课程,但从未参加过计算机体系结构课程。我不得不向Wiki / SO / Google学习。
我有一个名为dict
的{{1}},我需要并行查找(READ-ONLY)。我有一个LUT
list
个,我分散到多个线程/进程,然后每个线程/进程将查找item
中各个LUT[item]
的相应切片 - 列表。
我只能想到7个选项来实现这个目标:
item
。 1
模块,所有线程都查找相同的multithreading
dict
。 2
模块,所有进程都查找相同的multiprocessing
dict
。 3
模块,所有进程都会查找自己的multiprocessing
副本,例如如果有2个进程,则有dict
dict
。 4
模块,所有进程都查找“共享代理字典”:multiprocessing
以下3个选项使用Manager.dict
,因为我听说它可以用来克服Python的GIL。
Cython
。 Cython& C ++的STL 5
和unordered_map
,所有线程都查找相同的multithreading
unordered_map
。 Cython& C ++的STL 6
和unordered_map
,所有进程都查找相同的multiprocessing
unordered_map
。 Cython& C ++的STL 7
和unordered_map
,所有进程都会查找multiprocessing
我已经尝试过选项unordered_map
。 2, 3, & 4
比串行查找慢约100-1000倍。选项2 & 4
运行良好,但其内存使用率过高,因为它使用了字典的多个副本。
选项3
使用5, 6, & 7
及其使用C ++的STL Cython
进行扩展的能力,这是C ++ - 相当于Python的unordered_map
。选项dict
在技术上应该克服Python的GIL,但我想知道多线程是否真的可以解决受CPU限制的问题。我最好的选择是什么?