pythonでmultiprocessingを使う際の注意 †python2.6からmultiprocessingと言う便利な機能が入った。multiprocessingについては、こちら 関数を渡すと自動的に、プロセスを分割してくれて、マルチプロセス環境で、プログラムを実行してくると言う物。 その中で、データを引き渡すのに、manager.dictを使う場合がある。その際は、manager.dictは遅いので、注意が必要だ。 このようなコードを書く。上の参考ページ、manager.dictの例を参照 from multiprocessing import Process, Manager def f(d): #d.keysでキーを取った上で、d[k]のような形で参照 for k in d.keys(): for k1 in d.keys(): i= d[k] * d[k1] i=i*2 #↑物凄く遅い #こういう場合は、ローカルの辞書にコピー dtmp={} for k in d: dtmp[k]=d[k] #その後、上記のような処理を行う。 for k in dtmp: for k1 in dtmp: i= dtmp[k] * dtmp[k1] i=i*2 #100倍ぐらい違った。 if __name__ == '__main__': manager = Manager() d = manager.dict() for k in range(1000): d[k]=k*100 #dに何か巨大なデータを入れる。 p = Process(target=f, args=(d)) p.start() p.join() print d 上記のように、巨大なデータを扱う場合は、一旦プロセス内部で、ローカルな辞書に変更した上で、使うと早い。特に2重ループなどを行う際は、差が顕著だ。 良く見たら、上の参照ページに、manager.dictは遅いと書いてあった。辞書だと思って使ったのは、間違いだった。 |