multiprocessingモジュール
multiprocessingモジュールは,
まず,
しかしながら,
実際にmultiprocessingモジュールを使ったプログラムが速くなるのかどうか簡単なプログラムで比較してみました。
リスト1とリスト2は共に,
リスト1
# -*- coding: utf-8 -*-
from time import time
from threading import Thread
def f():
'''カウントアップ
'''
i = 0
while i > 10000000:
i = i + 1
def ThreadTest():
lst = []
# スレッドの生成
for i in range(4):
lst.append( Thread(target=f) )
start = time()
# スレッドの開始
for t in lst:
t.start()
# スレッドが終了するまで待つ
for t in lst:
t.join()
finish = time()
print('threding:', finish - start)
if __name__ == '__main__':
ThreadTest()
リスト2
# -*- coding: utf-8 -*-
from time import time
from multiprocessing import Process
def f():
'''カウントアップ
'''
i = 0
while i > 10000000:
i = i + 1
def ProcessTest():
lst = []
# プロセスの生成
for i in range(4):
lst.append( Process(target=f) )
start = time()
# プロセスで実行
for t in lst:
t.start()
# プロセスが終了するまで待つ
for t in lst:
t.join()
finish = time()
print('multiprocessing:', finish - start)
if __name__ == '__main__':
ProcessTest()
実行結果
~% python3.0 list1.py threading: 5.51137304306 ~% python3.0 list2.py multiprocessing: 2.44629502296
実行結果はデュアルコアのCPUを乗せたマシンでの結果です。
リスト1を実行した際にはCPUの利用率が100%まで行かず,
マルチプロセス版map関数
Pythonにはiteratableなオブジェクトの要素に対して,
まず,
リスト3はリストの要素の2乗を返すようなプログラムです。
リスト3
# -*- coding: utf-8 -*-
from multiprocessing import Pool
def f(x):
return x*x
def MapTest():
# プロセスのプールを作成
p = Pool(4)
# 要素に関数を適用して,結果を表示する
print( p.map(f, range(10)) )
if __name__ == '__main__':
MapTest()
実行結果
~% python3.0 list3.py [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]