concurrent.featureを使って、マルチプロセスとマルチスレッドの実行速度の比較を行ってみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
from concurrent.futures import ProcessPoolExecutor from concurrent.futures import ThreadPoolExecutor import time def myfunc(): sum = 0 for n in range(50000000): sum += n def main(): start = time.time() for i in range(8): myfunc() period = time.time() - start print(f"Single Thread : {period}s") start = time.time() with ThreadPoolExecutor() as ex: for i in range(8): ex.submit(myfunc) period = time.time() - start print(f"Multi Thread: {period}s") start = time.time() with ProcessPoolExecutor() as ex: for i in range(8): ex.submit(myfunc) period = time.time() - start print (f"Multi Process: {period}s") if __name__ == '__main__': main() |
結果
myfunc()を8回繰り返しているシングルスレッドの実行速度からmyfunc()の実行速度は1.2s程度だと算出できる。
マルチスレッドでは、GILが効いていてほとんど並列に実行されていない。 一方、マルチプロセスでは8個のプロセスがほぼ同時に実行されているように見える。
この結果から見ると、並列処理ではマルチプロセスを使ったほうがいいように思うけど、メモリ領域を共有した場合はどうなるかな..。