pythonの並列計算(CPUの数だけ並列させる)

python使いなのですが、今まで並列計算を必要としていなかったので、この手の知識が0でした。しかし、必要に迫られたので、勉強してみました。
まず、一番手っ取り早く並列計算できそうなサンプルコード。

# -*- 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)
とするといいかもしれません。

コメント