multiprocessing .get()方法比.map_async()

时间:2019-10-10 15:36:43

标签: python python-multiprocessing

对于给定范围的参数值,我正在将解决方案与IVP并行化。使用multiprocessing.map_async()解决多个IVP的速度很快,但是使用.get()方法从池中获取结果的速度要慢大约1000倍。

class paralell_class:
    def __init__(self, params, times, method, bounds, solver):
        self.params=params
        self.times=times
        self.method=method
        self.bounds=bounds
        self.solver=solver
    def paralell_simulate(self, weight_val_entry):
        self.sim_params=copy.deepcopy(self.params)
        for i in range(len(weight_val_entry[0])):
            self.sim_params[weight_val_entry[0][i]]=weight_val_entry[1][i]
        time_series=self.solver(self.sim_params, self.times, self.method,-1, self.bounds)
        time_series=np.multiply(time_series, weight_val_entry[2])
        return (time_series)
    def paralell_dispersion(self, weight_list):
        p = mp.Pool(4)
        start=time.time()
        sc = p.map_async(self,  [weight for weight in weight_list])
        print "Simulation time" + str(time.time()-start)+" s"
        start=time.time()
        results=sc.get()
        print ".get() time" +str(time.time()-start)+" s"
        p.close()
        start=time.time()
        disped_time=np.sum(results, axis=0)
        return disped_time
    def __call__(self, x):
        return self.paralell_simulate(x)

在此question中,建议使用减慢方法速度的数组大小。但是,增加求解器的时间间隔(即较少的数据)并不会改变时间:

具有完整的时间序列(5000个时间点,20个模拟)

"Simulation time 0.000575065612793 s"
".get() time 0.877493143082 s"

当整个时间序列减少到500个时间点(20个模拟)

"Simulation time 0.000617027282715 s"
".get() time 0.950036048889 s"

如果减少仿真次数,则速度会提高 (5000个时间点,10个模拟)

"Simulation time 0.000108003616333 s"
".get() time 0.239893913269 s"

这是多处理模块的预期行为吗?

0 个答案:

没有答案