Pythonのマルチスレッドとマルチプロセスモジュールの比較テスト
1521 ワード
本稿では,主にPythonのマルチスレッドとマルチプロセスモジュールのCPUタイプとI/Oのタスク操作をテストする際の効率を比較する.
CPU消耗タイプをテストするタスク
マルチコアCPU 1台のサーバ上でマルチスレッドコードを実行し、理論的にはコード実行時に余分なCPUコアを利用して性能を向上させる.しかしPythonのGILが存在するため,マルチスレッドを用いてCPUの煩雑なタスクを実行することで,必ずしも性能向上が得られるとは限らない.しかしGILは、Pythonインタプリタでスレッドを実行するのは安全ではないため、つまりPythonスレッドの実行時の安全を保証するために、Pythonはグローバルロックを提供し、同じ時点で、1つのスレッドだけがこのフルロックを取得して実行することを許可する.
CPU消耗タイプタスク
1.単一スレッドテスト
単一スレッドを使用した実行時間は約4.9秒
2.2スレッド使用
threads=3の設定
2つのスレッドを使用して以上のタスクを実行すると、パフォーマンスが大幅に低下します.
3.4スレッド使用
threads=5の設定
4.8スレッド使用
threads=9の設定
以上のテストから,Pythonのマルチスレッドモジュールを用いると,スレッド数が多いほどCPU消費型のタスクを実行する際に効率が低下することが分かる.
5.単一プロセステスト
参照ドキュメント:
https://www.quantstart.com/articles/parallelising-python-with-threading-and-multiprocessing
CPU消耗タイプをテストするタスク
マルチコアCPU 1台のサーバ上でマルチスレッドコードを実行し、理論的にはコード実行時に余分なCPUコアを利用して性能を向上させる.しかしPythonのGILが存在するため,マルチスレッドを用いてCPUの煩雑なタスクを実行することで,必ずしも性能向上が得られるとは限らない.しかしGILは、Pythonインタプリタでスレッドを実行するのは安全ではないため、つまりPythonスレッドの実行時の安全を保証するために、Pythonはグローバルロックを提供し、同じ時点で、1つのスレッドだけがこのフルロックを取得して実行することを許可する.
CPU消耗タイプタスク
def f(n):
list=[]
for x in range(n):
x=x*x
list.append(x)
1.単一スレッドテスト
#!/usr/sbin/python
import threading
def f(n):
list=[]
for x in range(n):
x=x*x
list.append(x)
if __name__ == '__main__':
threads=2
tasks=[]
for i in range(1,threads):
thread=threading.Thread(target=f(10000000))
tasks.append(thread)
for j in tasks:
j.start()
for j in tasks:
j.join()
real 0m4.965s
user 0m4.104s
sys 0m0.797s
単一スレッドを使用した実行時間は約4.9秒
2.2スレッド使用
threads=3の設定
real 0m8.469s
user 0m7.480s
sys 0m0.981s
2つのスレッドを使用して以上のタスクを実行すると、パフォーマンスが大幅に低下します.
3.4スレッド使用
threads=5の設定
real 0m16.016s
user 0m14.712s
sys 0m1.285s
4.8スレッド使用
threads=9の設定
real 0m31.374s
user 0m29.231s
sys 0m2.108s
以上のテストから,Pythonのマルチスレッドモジュールを用いると,スレッド数が多いほどCPU消費型のタスクを実行する際に効率が低下することが分かる.
5.単一プロセステスト
参照ドキュメント:
https://www.quantstart.com/articles/parallelising-python-with-threading-and-multiprocessing