我有一个关于 python 中的多处理的快速问题。
我正在对三个参数进行相当大的网格搜索,计算大约需要 14 小时才能完成。我想通过使用多处理来缩短运行时间。
我的代码的一个非常简化的示例在这里:
import numpy as np
import pickle
import time
a_range = np.arange(14, 18, 0.2)
b_range = np.arange(1000, 5000, 200)
c_range = np.arange(12, 21, .5)
a_position = range(len(a_range))
b_position = range(len(b_range))
c_position = range(len(c_range))
data_grid = np.zeros([len(a_range), len(b_range), len(c_range)])
record_data = []
start_time = time.time()
for (a,apos) in zip(a_range, a_position):
for (b, bpos) in zip(b_range, b_position):
for (c, cpos) in zip(c_range, c_position):
example = a+b+c #The math in my model is much more complex and takes
#about 7-8 seconds to process
data_grid[apos, bpos, cpos] = example
record_data.append([a, b, c, example])
with open('Test_File', 'wb') as f:
pickle.dump(record_data, f)
np.save('example_values', data_grid)
print 'Code ran for ', round(time.time()-start_time,2), ' seconds'
现在,我在多处理方面的经验绝对为零,所以我的第一次尝试是将 for 循环更改为一个函数,然后像这样调用多处理函数:
def run_model(a, b, c, apos, bpos, cpos):
example=a+b+c
data_grid[apos, bpos, cpos]=example
record_data.append([a, b, c, example])
from multiprocessing import Pool
if __name__=='__main__':
pool=Pool(processes=4)
pool.map(run_model, [a_range, b_range, c_range, a_position, b_positon, c_positon])
pool.close()
pool.join()
然而,这在 pool.map 调用中失败了。我知道这个函数只需要一个可迭代的参数,但我不知道如何解决这个问题。我也怀疑 data_grid 变量是否会被正确填充。我想要从这个函数得到的结果是保存了两个文件,一个是一个值数组,其索引对应于 a、b 和 c 值,最后一个是包含 a、b、c 值和结果值的列表列表(例如在上面的代码中)
谢谢你的帮助!
-将要