我有一种遗传算法,其适应度函数是一个繁琐的模拟环境。代码绝对是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]
SimWorker:
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)