前提・実現したいこと
multiprocessing.Pool で一部分を並列化したいと考えております.
以下に簡略化したプログラムを示します.
並列化したい関数
python
1import multiprocessing 2from multiprocessing import Pool 3 4def func1(num): 5 li = [] 6 for a in range(num): 7 for b in range(a, a*2): 8 for c in range(a, a*3): 9 d = func2(a, b, c) # TrueかFalseが返る 10 if d: 11 li.append([a, b, c]) 12 if li != []: 13 break 14 return li
このプログラムで伝えたいことは
・上から2つ目と3つめ目のforループのb, cはaによって決まる(実際はrange(数値)ではありません)
・func1の目的は,条件を満たす(func2でTrueが返る)最小のaとその組b, cを求める
ということです.
試したこと
以下のように並列化してみました.
python
1def mult_func1(num): # func1の並列化 2 for a in range(num): 3 target = [] 4 for b in range(a, a*2): 5 for c in range(a, a*3): 6 target.append((a, b, c)) 7 with Pool(multiprocessing.cpu_count()) as pool: 8 result = pool.starmap(func3, target) 9 pool.close() 10 result = [x for x in result if x] # 空リストを削除 11 if result != []: 12 break 13 return result 14 15def func3(a, b, c): 16 d = func2(a, b, c) 17 if d: 18 return a, b, c 19 else: 20 return []
しかし,このプログラムは並列化する前よりも倍以上実行時間がかかってしまいました.
forループの中に並列化処理を入れているせいで遅くなってしまっていると思いますが,どのように解決したらよいでしょうか?
numは大きい値のため,3重ループを並列化処理して,すべての処理が終わった後に最小のaの組を取り出すという操作は避けたいです.
よろしくお願いいたします.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/11 03:38
2020/01/11 07:44
2020/01/11 13:48
2020/01/12 05:26