我有一个遗传算法,它的适应度函数是一个繁琐的模拟环境。该代码绝对受 CPU 限制,在 64 位 python 3.3 上运行,因此我实现multiprocessing.starmap_async
了并行化。
而且它工作得很好,比串行效率大大提高。在我的处理器上,Intel i7 CPU @ 2.40 GHz(16GB RAM):我注意到 4 个进程的运行时间为 8 到 9 秒(2 个进程更慢,串行更慢)。
但是,这仅使用了我的处理器的 65% 到 73%。
将进程计数增加到 6 会利用 95% 到 100% 的处理器,但运行时间为 11 秒。内存仍然在 20% 左右
将此计数增加到 8,处理器始终保持在 100%,但运行时间现在为 12 秒。内存刚刚好。
我不能发布所有内容,但下面是多处理调用(删除了参数)。我有什么办法可以在不减速的情况下利用更多的处理器吗?我也很感激任何帮助理解为什么会发生这种现象。
多处理调用:
step = np.int8(pop_size/4)
pol = Pool(processes=4)
res = pol.starmap_async(SimWorker, ((i, i+step,pop,"a bunch of other arguments") for i in range(0, pop_size, step)))
fitnessdict = res.get()
fitnessdict = np.asarray(fitnessdict)
for i in range(0,pop_size,step):
for p in range(i,i+step):
fitness[p] = fitnessdict[i/step,p]
模拟工人:
def SimWorker(start, stop, pop, "a bunch of other arguments"):
"""
Run a batch of sims
"""
for p in range(start, stop):
fitness[p] = Sim_T(pop[p],"a bunch of other arguments")
return(fitness)