我有一个列表, L 和大字典, D 包含密钥, K 其中k是中的特定密钥ķ即可。 D [k]包含确定结果列表所需的一些信息。现在我正在搜索 K 中的每个值,如果这些信息对我有价值,我会将k附加到 L 。这是迭代的方式,但我希望我可以通过多线程加快速度。字典永远不会有更新。什么是实施这个的好方法?
答案 0 :(得分:5)
根据您正在使用的Python解释器,以及您在搜索字典时使用的确切方法,多线程可能不会加快速度。 cpython的Global Interpreter Lock (GIL)意味着在给定的时间只有一个线程可以执行python代码。
现在,如果您使用的是用C语言编写的库并针对性能进行了优化,那么他们可能会在进行数学繁重时释放GIL(NumPy是good example)。这同样适用于等待I / O的线程。除此之外,由于切换线程上下文涉及开销,因此您可能最终会因多线程而变慢。
在Python中,您通常可以使用multi-processing获得更好的结果。每个进程都有自己的GIL,因此代码可以并行运行。假设您的字典确实是只读的,那么很容易将字典的副本提供给每个生成的进程。
多处理的缺点是线程之间的通信涉及更多的开销,因此执行越孤立,您将看到的结果越好。值得注意的是,Windows往往会产生一个higher cost associated来生成新进程,但这不应该是任何CPU限制的问题,因为您将拥有的进程数量可能非常小。
答案 1 :(得分:2)
一般的想法是MapReduce或Producer-Consumer模式:
地图阶段/制作人: 将搜索空间除以您想要生成的进程数(例如,对于四个进程,每个进程获得1/4的键以及对字典的引用)。
缩小/消费者: 当进程找到命中时,它会将值发送到线程安全队列。
当所有进程完成后,您的队列将保留结果。
几乎可以肯定,您会找到最省力的方法是使用multiprocessing.Pool.map
函数(docs)