* 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は遅いと書いてあった。辞書だと思って使ったのは、間違いだった。