Python でのマルチプロセッシングに関して簡単な質問があります。
3 つのパラメーターでかなり大規模なグリッド検索を行っていますが、計算が完了するまでに約 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 呼び出しで失敗しました。この関数が反復可能な引数を 1 つしかとらないことは理解していますが、問題を解決する方法がわかりません。また、data_grid 変数が正しく入力されるかどうかについても懐疑的です。この関数から得たい結果は、保存された 2 つのファイルです。1 つはインデックスが a、b、c の値に対応する値の配列として、最後のファイルは a、b、c の値と結果の値を含むリストのリストです (例上記のコードで)
助けてくれてありがとう!
-意思