Pythonのmultiprocessing.Pool.mapで複数引数を扱う方法

Pythonmultiprocessingライブラリを使って、並列処理を行う場合、複数の引数を渡す方法としてstarmap()partial()がよく使用されます。ここでは、それぞれの方法を解説します。

starmap()を使う方法

starmap()は、複数の引数をタプル形式で関数に渡すことができます。以下のようにzip()やリストを使って引数をまとめ、各プロセスに分配します。

使用例

from multiprocessing import Pool
def func(a, b):
    return a + b
if __name__ == '__main__':
    with Pool(4) as pool:
        results = pool.starmap(func, [(1, 2), (3, 4), (5, 6)])
        print(results)

このコードは、2つの引数を持つfunc()を並列に処理し、それぞれの結果を出力します。

partial()を使う方法

functools.partial()を使うことで、関数の一部の引数を固定しておき、残りの引数だけを並列処理に渡すことが可能です。

使用例

from multiprocessing import Pool
from functools import partial
def func(a, b):
    return a + b
if __name__ == '__main__':
    a_args = [1, 2, 3]
    second_arg = 10
    with Pool(4) as pool:
        results = pool.map(partial(func, b=second_arg), a_args)
        print(results)

このコードでは、bの引数を固定し、a_argsの値とともに関数funcを並列に実行します。

まとめ

複数の引数を並列処理するには、starmap()を使って引数のタプルを渡す方法が直感的で便利です。一方、partial()を使うことで、一部の引数を固定した処理も柔軟に行うことができます。プロジェクトの要件に応じてこれらの方法を使い分けましょう。