Pythonでの並列処理の効果

こんにちは、ネザーです。

今回はPythonでの並列処理の効果について説明します。

まずPythonでは1つのCPUコアで処理を行います。この場合、同時に複数の処理を行うことができないため、同じ処理を複数回行う場合、処理の回数だけ処理時間がかかることになります。例えばfor文などで1分かかる処理を20回繰り返すと、20分くらいかかります。

このように、同じ処理を複数回行う場合は、並列処理を使うと高速化できます。例えば、1分かかる処理を20回繰り返していた処理を同時に4つまで処理できるようにすると、単純計算で5分くらいまで約75%高速化することができます。ちなみに、処理時間を並列化できる処理数はCPUのコア数(スレッド数)までです。並列化できる処理数はmultiprocessing.cpu_countで確認できます。

Pythonで並列処理を行う場合、最も簡単な方法はmultiprocessing.Poolを使うことです。下記が並列処理を使わない場合と、使う場合のサンプルコードになります。

# 並列処理を使わない場合
def any_function(x):
  something() # 何らかの処理

if __name__ == "__main__":
  for i in range(20):
    any_function(i)
# 並列処理を使う場合
from multiprocessing import Pool

def any_function():
  something() # 何らかの処理

if __name__ == "__main__":
  p = Pool(4)  # 並列化処理数を引数で指定
  p.map(any_function, range(20)  # Pool.mapの第一引数に処理対象のメソッド名を指定

理論的には並列処理の数だけ高速化ができますが、実際には処理内容によって、例えばファイルI/OなどCPU処理以外の時間がかかる場合があるため、どれくらい高速化できるかは変わってきます。

実際に私の環境で20枚の画像を用いて、各画像ごとに画像処理を施して100枚の画像生成してファイルに保存する処理を並列処理したところ、並列処理を用いない場合は約80秒、並列処理数が4で約29秒かかりました(理論的には並列処理数が4の場合約20秒になるはずです)。

いずれにしても並列処理を行うことで、処理を高速化することができますので、試したことがない方は一度試してみる価値はあると思います。



この記事が気に入ったらサポートをしてみませんか?