2017-08-12 6 views
0

私は、マルチスレッド化とマルチプロセッシングとループの並列化を試みることに非常に新しいです。私は同様の質問を検索し、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上で実行している)

答えて

0

@Alex Hallに記載されているとおり、反復をfun1から削除します。また、すべてのプールの作業員が終了するまで待ちます。

PEP8注:import timeit, multiprocessingは2行に分割することをお勧めします。

import multiprocessing 
import timeit 


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): 
    x,y,z = d1[gn] 
    d2.update({gn:((x+y+z)/3)}) 


if __name__ == '__main__': 
    gen1 = [x for x in d1.keys()] 

    # serial processing 
    for gn in gen1: 
     fun1(gn) 

    # paralel processing 
    p = multiprocessing.Pool(3) 
    p.map(fun1, gen1) 
    p.close() 
    p.join() 

    print('Script finished') 
    stop_time = timeit.default_timer() 
    print(stop_time - start_time) 
1

p.mapあなたのためのループを行い、そのfor i in gn:を削除します。

つまり、は、gen1の各要素にfun1を適用します。したがって、gnは、これらの要素の1つです。

関連する問題