Pythonのmultiprocessingで並列処理

Pythonでの並列処理について勉強したのでまとめ
軽い処理では並列にしない方が高速でしたが、
重たい処理は並列処理によって高速化できることを確認しました。

multiprocessing

Pythonでは標準ライブラリのmultiprocessingを用いて並列処理が可能です。

from multiprocessing import Pool

def func(x):
    return x*x

if __name__ == "__main__":
    pool = Pool(4) # 並列化する数
    pool.map(func, range(10)) # range(10)の各要素についてfunc関数の処理を並列に実行

コア数の確認は以下で可能です。

import multiprocessing
print multiprocessing.cpu_count()

速度の比較

次の2つの関数について、普通に実行する場合とmultiprocessingを用いて実行する場合とで処理時間を計測します。

# 軽い処理
def func1(x):
    return x*x

# 重い処理
def func2(x):
    for i in range(x):
        for j in range(i):
            pass

if __name__ == "mian":
    map(func, range(1000)) # 普通にmap
    pool = Pool(4)
    pool.map(func, range(1000)) # multiprocessing
func1 finc2
普通にmap 0.000185012817383 4.20705986023
multiprocessing 0.0154550075531 1.90538191795

軽い処理ではmultiprocessingによって性能が落ちていますが、重い処理に対してはmultiprocessingの効果で処理速度が速くなっていることが確認できます。