* pythonでmultiprocessingを使う際の注意 [#je702faf]

python2.6からmultiprocessingと言う便利な機能が入った。multiprocessingについては、[[こちら:http://coreblog.org/ats/multiprocessing-package]]

関数を渡すと自動的に、プロセスを分割してくれて、マルチプロセス環境で、プログラムを実行してくると言う物。

その中で、データを引き渡すのに、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重ループなどを行う際は、差が顕著だ。
良く見たら、[[上の参照ページ:http://coreblog.org/ats/multiprocessing-package]]に、manager.dictは遅いと書いてあった。辞書だと思って使ったのは、間違いだった。

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS