LoginSignup
86
97

More than 3 years have passed since last update.

もうわたし苦労しない。。 Pythonの標準ライブラリを使ってマルチプロセス。

Last updated at Posted at 2020-03-04

概要

マルチプロセス、簡単にやりましょう。
でも、ちょっとやり方に詰まって結局時間節約できなかった。。?? 

もぅマヂ無理。。。。。普通にfor文まわそ。。。。

そういう人に読んでもらいたい。

Pythonの標準装備であるProcessPoolExecutorとfunctools.partial をつかって、快適にマルチプロセスで並列計算しましょう。
使えるものは、使わないと損だよね??

状況説明

test.py

def my_function(arg1):
    for i in range(100):
        'めっちゃヘビーな処理ですのん'
        result_list.append(some_operation(i))

if __name__ == "__main__":
    my_function()

こういう書き方、けっこう何も考えずに書きますよね?
こういうとき、100回の処理あるけど、マルチプロセスで簡単に並列処理したい。。。

簡単なやり方

  1. 関数をちょろっと書き直します。
  2. ProcessPoolExecutor をインポート。
  3. functools.partial をインポートし関数をマッピング。

1. 関数をちょろっと書き直します。

先ほどの my_functionを、こんな風に書きます。

test.py
def my_function(index, arg1):
    return some_operation(index)

つまり、ループを書くんじゃなくて、インデックスを渡して、一個一個処理するみたいなイメージ。

2. ProcessPoolExecutor をインポート。

まず、以下のように書きます。

test.py
import os
from concurrent.futures import ProcessPoolExecutor

max_workers = os.cpu_count() or 4
print('=====MAX WORKER========')
print(max_workers)

with ProcessPoolExecutor(max_workers=max_workers) as executor:

max_workers は、使用可能なプロセス数が格納されます。もし格納できない場合、この例では4が入ります。

3. functools.partial をインポートし関数をマッピング。

つづいて、こんな風に書きます。

test.py
import functools

with ProcessPoolExecutor(max_workers=max_workers) as executor:
    result_list = list(executor.map(functools.partial(my_function, arg1), range(100)))
    executor.shutdown(wait=True)

これだけです。
少し解説すると、今までループで書いて、result_listにアペンドしていた操作は、
my_funtionにインデックスを渡すことで、各インデックスでのオペレーションを複数プロセスに分けて実行するため。

functools.partial は、関数(my_function)の一部の引数を変えて、引数の変わったそれぞれの関数を関数のイテレータとして返します。このとき、my_function(index, arg1) のように、変更される引数は1つであり、それが関数の第一引数となっていることに注意!!

さらに、executor.mapにより、そのmy_functionに渡される第一変数であるindexは、イテレータであるrange(100)のそれぞれで並列実行され、各実行結果がlistに格納されます。
これはまさに、result_listに各ループでアペンドしていた時と一緒です。

まとめ

少しでも時間を節約するためにやりたいマルチプロセス。マルチプロセスの書き方で苦労して結局時間めっちゃかかった、、みたいなことになるの、辛いですよね。。。
今回は自分的にかなり簡単にPythonの標準ライブラリだけをつかって書けるマルチプロセスについて紹介させていただきました!!

おわり。

86
97
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
97