ChatGPTにシングルプロセスとマルチプロセスの処理速度を比較するPythonコードを書いてもらった

Python3系では、multiprocessingモジュールを利用して、簡単にマルチプロセスプログラミングを行うことができます。そこで、ChatGPTにシングルプロセスとマルチプロセスの処理速度を比較するPythonコードを書いてもらいました。

 

指示文(プロンプト):

マルチプロセスで大規模な行列の操作を行うサンプルコードを教えてください。
比較用にシングルプロセスで実行する場合のコードも提示してください。
それぞれ実行時間も出力するように訂正してください。
少し計算時間が長くなるように計算を複雑にしてください。

 

回答:

【マルチプロセスの例(計算を複雑化)】


import numpy as np
from multiprocessing import Pool
import time

# マトリックスのサイズ
matrix_size = (2000, 2000)

# サンプル行列の生成
matrix = np.random.rand(*matrix_size)

# 計算量が増える複雑な行列の操作を行う関数
def process_matrix_row(row):
    for _ in range(1000):  # 行列の操作を1000回繰り返す
        row = np.sin(row) * np.cos(row)
    return row

# マルチプロセスで行列の操作を並列化する
def process_matrix_parallel(matrix):
    pool = Pool()  # プロセスプールの作成
    result = pool.map(process_matrix_row, matrix)  # マルチプロセスで行列の操作を並列実行
    pool.close()
    pool.join()
    return np.array(result)

# マルチプロセスでの実行時間を計測
start_time = time.time()
result_parallel = process_matrix_parallel(matrix)
end_time = time.time()
execution_time_parallel = end_time - start_time
print("マルチプロセスの実行時間:", execution_time_parallel, "秒")
    

【シングルプロセスの例(計算を複雑化)】


import numpy as np
import time

# マトリックスのサイズ
matrix_size = (2000, 2000)

# サンプル行列の生成
matrix = np.random.rand(*matrix_size)

# 計算量が増える複雑な行列の操作を行う関数
def process_matrix_row(row):
    for _ in range(1000):  # 行列の操作を1000回繰り返す
        row = np.sin(row) * np.cos(row)
    return row

# シングルプロセスで行列の操作を実行
def process_matrix_sequential(matrix):
    result = []
    for row in matrix:
        result.append(process_matrix_row(row))
    return np.array(result)

# シングルプロセスでの実行時間を計測
start_time = time.time()
result_sequential = process_matrix_sequential(matrix)
end_time = time.time()
execution_time_sequential = end_time - start_time
print("シングルプロセスの実行時間:", execution_time_sequential, "秒")
    

上記のコードでは、マルチプロセスの場合にはmultiprocessing.Poolを使用してプロセスプールを作成し、mapメソッドを使って行列の操作を並列実行しています。シングルプロセスの場合には、単純なforループを使用して行列の操作を順次実行しています。 これらのコードを実行すると、マルチプロセスとシングルプロセスの実行時間を比較して、マルチプロセスの方が処理時間が短くなることを確認できるでしょう。

結果:

以下のようにシングルに比べてマルチでは処理時間がかなり短くなったことが確認できました。こんなシンプルなコードで並列処理が出来るのは楽しいですね。

シングルプロセスの場合、1つのCPUにだけ負荷がかかっていることがわかります。

マルチプロセスの場合、すべてのCPUに負荷がかかっていることがわかります。

ただし、これは行列サイズを小さくしてCPU負荷による差が大きくなるようにしたサンプルコードです。試しに行列サイズを1万×1万にすると、逆にマルチ側が遅くなったりします。CPUではなくメモリが処理時間に影響してくるケースです。実務での場合は、並列処理する関数をわけたり、コア数を意識したり、共有メモリでプロセス間のデータ共有をしたりと、考慮すべき点が多いです。