私は、マルチスレッド化とマルチプロセッシングとループの並列化を試みることに非常に新しいです。私は同様の質問を検索し、multiprocessingモジュールに基づいてコードを作成しました。Pythonのループを並列化する方法
import timeit, multiprocessing
start_time = timeit.default_timer()
d1 = dict((i,tuple([i*0.1,i*0.2,i*0.3])) for i in range(500000))
d2={}
def fun1(gn):
for i in gn:
x,y,z = d1[i]
d2.update({i:((x+y+z)/3)})
if __name__ == '__main__':
gen1 = [x for x in d1.keys()]
fun1(gen1)
#p= multiprocessing.Pool(3)
#p.map(fun1,gen1)
print('Script finished')
stop_time = timeit.default_timer()
print(stop_time - start_time)
# 出力:
Script finished
0.8113944193950299
私はコードのように変更した場合:
#fun1(gen1)
p= multiprocessing.Pool(5)
p.map(fun1,gen1)
私はエラーを取得:
for i in gn:
TypeError: 'int' object is not iterable
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
raise self._value
任意のアイデアをどのようにこの並列を作るには? MATLABには、並列ループを作成するためのparfor
オプションがあります。私はこのアプローチを使用してループを並列化しようとしていますが、動作しません。任意のアイデアをどのようにループを並行させることができますか?また、関数が値を返す場合はどうすればいいですか?fun1()
が3の値を返す場合、a,b,c=p.map(fun1,gen1)
のようなものを書くことができますか? (Windowsのパイソン3.6上で実行している)