对于给定范围的参数值,我正在将解决方案与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"
这是多处理模块的预期行为吗?