2017-02-08 15 views
3

私はスピードアップしたい(マルチプロセッシングを使って)次のコードを書いています。Pythonでループをマルチプロセッシングする

def main(arg1): 
    data=[] 
    #Calculate new argument arg2 
    for i in range(n): 
     data.append(function(z,i,arg2)) 

ここで、zは2次元配列である。 私の考えは次のようにしていましたが、これによりプロセスがスピードアップするとは思えません。

from multiprocessing import Pool 
import itertools 

def function_star(a_b_c): 
    return function(*a_b_c) 

def main(arg1): 
    #Calculate new argument arg2 
    pool=Pool() 
    i=range(n) 
    out=pool.map(function_star, i, itertools.repeat(z),itertools.repeat(arg2)) 
    pool.close() 

if __name__=="__main__": 
    main(arg1) 

これは確かにプロセスをスピードアップする最も効率的な方法ですか?

答えて

1

私が正しくあなたのコードブロックを解釈する場合は、常に同じzと呼ばfunction、およびarg1を持ちたいけど、あなたが貼り付けられたコードは動作しませんので、mapだけ取るようi範囲であることを(私は、少しわかりませんよ1反復可能とあなたが3)

を与えている。このような場合は、その後、partialはあなたの問題を解決:0を変更するように、あなたはあなたの関数の引数の順序を変更する必要が

from multiprocessing import Pool 
from functools import partial 

def function(i, z, arg2): 
    print(z, i, arg2) 

def main(arg1): 
    #Calculate new argument arg2 
    pool=Pool() 
    i=range(n) 

    out=pool.map(partial(function, z=5, arg2=3), i) 
    pool.close() 

if __name__=="__main__": 
    main(arg1) 

ノートパラメータは最初の位置にあります。

スピードが気になる場合は、チャンクサイズでmapに3番目の引数を追加する必要があります。これにより、メインプロセスからのパケットがchunksizeであることが要求され、メインプロセスと子プロセス間の通信数が少なくなります。

関連する問題