python使いなのですが、今まで並列計算を必要としていなかったので、この手の知識が0でした。しかし、必要に迫られたので、勉強してみました。
まず、一番手っ取り早く並列計算できそうなサンプルコード。
http://d.hatena.ne.jp/halhorn/20100904/1283612722
Poolという機能を使うと、回すスレッド数を指定するだけで、pythonが勝手に並列計算してくれます。
このサンプルの肝は、9行目。関数fugaに引数としてrange(10)の要素を与えて、len(range(10))個のプロセスを走らせるわけです。ちなみに、Poolは、ターミナルの対話モードでは動かないらしいので、11, 12行目が必ず必要です。
でも、8行目で動かすプロセス数を8と指定しているので、もし24プロセッサあっても8プロセッサだけ動きます。
下のようにしてやれば、今使ってる計算機のCPUの数だけ(正確には、論理プロセッサ数だけ)並列化します。
CPU使用率100%は気持ち悪いので、
p = Pool(multiprocessing.cpu_count() - 1)
とするといいかもしれません。
まず、一番手っ取り早く並列計算できそうなサンプルコード。
# -*- coding: utf-8 -*- from multiprocessing import Pool def fuga(x): # 並列実行したい関数 return x*x def hoge(): p = Pool(8) # 8スレッドで実行 print p.map(fuga, range(10)) # fugaに0,1,..のそれぞれを与えて並列演算 if __name__ == "__main__": hoge()
http://d.hatena.ne.jp/halhorn/20100904/1283612722
Poolという機能を使うと、回すスレッド数を指定するだけで、pythonが勝手に並列計算してくれます。
このサンプルの肝は、9行目。関数fugaに引数としてrange(10)の要素を与えて、len(range(10))個のプロセスを走らせるわけです。ちなみに、Poolは、ターミナルの対話モードでは動かないらしいので、11, 12行目が必ず必要です。
でも、8行目で動かすプロセス数を8と指定しているので、もし24プロセッサあっても8プロセッサだけ動きます。
下のようにしてやれば、今使ってる計算機のCPUの数だけ(正確には、論理プロセッサ数だけ)並列化します。
# -*- coding: utf-8 -*- from multiprocessing import Pool import multiprocessing def fuga(x): # 並列実行したい関数 return x*x def hoge(): p = Pool(multiprocessing.cpu_count()) # 論理プロセッサの数分、並列化 print p.map(fuga, range(10)) # fugaに0,1,..のそれぞれを与えて並列演算 if __name__ == "__main__": hoge()
CPU使用率100%は気持ち悪いので、
p = Pool(multiprocessing.cpu_count() - 1)
とするといいかもしれません。
コメント
コメントを投稿