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秒になるはずです)。
いずれにしても並列処理を行うことで、処理を高速化することができますので、試したことがない方は一度試してみる価値はあると思います。
この記事が気に入ったらサポートをしてみませんか?