Pythonで手軽に並列処理!Joblib.Parallelで高速化
この記事では、PythonのライブラリJoblibを使って、シンプルな並列処理(並行処理)を実装する方法について解説します。特に、joblib.Parallelを用いた処理の高速化に焦点を当てます。時間のかかる計算やデータ処理を効率的に行いたい場合に、Joblibは非常に強力なツールとなります。
並列処理とは?
並列処理(または並行処理)とは、複数のタスクを同時に実行することで、全体の処理時間を短縮する手法です。コンピュータのCPUに複数のコアが搭載されている場合、それぞれのコアで異なるタスクを同時に実行することで、単一のコアで順番に処理するよりも高速に処理を完了させることができます。
なぜ並列処理が必要なのか?
-
計算時間の短縮: 大規模なデータ処理や複雑なシミュレーションなど、単一のCPUコアでは時間がかかりすぎる処理を高速化できます。
-
リソースの有効活用: 現代のCPUはマルチコアが主流であり、並列処理によってこれらのCPUリソースを最大限に活用できます。
-
応答性の向上: 長時間かかる処理の間にUIがフリーズするのを防ぐなど、アプリケーションの応答性を高めます。
Joblibとは?
Joblibは、Pythonの関数を並列実行するための軽量なライブラリです。特に、NumPy配列を扱うような科学技術計算や機械学習の文脈でよく利用されます。シンプルなAPIで、複雑なマルチプロセスやマルチスレッドの知識なしに並列処理を実装できるのが特徴です。
Joblibのインストール方法
Joblibはpipを使って簡単にインストールできます。
pip install joblib
Joblib.Parallelを使った並列処理の基本
joblib.Parallelとjoblib.delayedを組み合わせて、並列処理を行う基本的な手順を説明します。
簡単な計算を並列化する
複数の独立した計算を並列で実行する例を見てみましょう。
from joblib import Parallel, delayed
import time
# 時間のかかるダミー関数
def process_item(item):
time.sleep(0.1) # 処理に時間がかかることをシミュレート
return item * 2
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# n_jobs=-1 で利用可能な全てのCPUコアを使用
# delayed(process_item)(i) で関数とその引数を遅延評価オブジェクトとしてラップ
results = Parallel(n_jobs=-1)(delayed(process_item)(i) for i in items)
print(results)
このコードでは、process_itemという時間のかかる関数を、itemsリストの各要素に対して並列に実行しています。
-
n_jobs=-1は、利用可能なCPUの全コアを使用することを意味します。 -
delayed(process_item)(i)は、process_item(i)の呼び出しをすぐに実行せず、後で並列実行キューに追加するための「遅延評価オブジェクト」を作成します。
実行すると、リストの要素が並列に処理され、約1秒程度で結果が表示されます(単一プロセスで実行した場合の約1/10)。
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
処理の進捗状況を表示する
verbose引数を使用すると、処理の進捗状況をターミナルに表示できます。
from joblib import Parallel, delayed
import time
def process_item_verbose(item):
time.sleep(0.1)
return item * 3
items = range(1, 21) # 20個のアイテム
# verbose=10 で10%ごとの進捗を表示
results = Parallel(n_jobs=-1, verbose=10)(delayed(process_item_verbose)(i) for i in items)
print(results)
verboseの値を大きくするほど、より詳細なログが出力されます。
並列処理の種類(バックエンド)
Joblibは、Parallelクラスのbackend引数を使って、異なる並列処理のバックエンドを選択できます。
-
'loky'(デフォルト): プロセスベースの並列処理。GIL (Global Interpreter Lock) の影響を受けず、CPUバウンドなタスクに適しています。最も推奨されるバックエンドです。 -
'threading': スレッドベースの並列処理。GILの制約を受けるため、I/Oバウンドなタスク(ファイル読み書き、ネットワーク通信など)に適しています。 -
'multiprocessing': Python標準のmultiprocessingモジュールを使用します。
特別な理由がなければ、デフォルトの'loky'を使用するのが最適です。
まとめ
Joblibのjoblib.Parallelは、Pythonで簡単に並列処理を実装し、コードの実行速度を向上させるための非常に便利なツールです。特に、独立した計算タスクが多数存在するような場合に、その威力を発揮します。ぜひJoblibを活用して、あなたのPythonスクリプトを高速化してみてください!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座
