長いシリーズに複雑な関数を適用する必要があります。12 コアのマシンにアクセスできるため、順次実行すると効率が悪いようです。
これに多大な投資をする前に、pool.map と map を比較するこの単純なバージョンを作成しました。
1) 驚くべきことに、map ははるかに高速です (以下の結果を参照)。
2) また、マップ版では出てこないプール機能にオーバーフローエラーがあります。
3) より小さい配列では、実行時の警告は表示されませんが、マップはさらに高速です。
私はコンピューター サイエンスの専門家ではありません (機能的なユーザーに過ぎません)。何か考えや提案はありますか? 非同期バージョンはシリーズの順序を台無しにする可能性があるため、pool.map を使用しました (これを整理するのは面倒です)。
以下の更新を参照してください:Jdogの提案に基づいています。
構成: Python v 2.7、64 ビット バージョン、Windows 7
#-------------------------------------------------------------------------------
# Name: poolMap
#-------------------------------------------------------------------------------
import multiprocessing as mp
import numpy as np
import time
def func(x):
y=x*x
return y
def worker(inputs):
num=mp.cpu_count()
print 'num of cpus', num
pool = mp.Pool(num)
#inputs = list(inputs)
#print "inputs type",type(inputs)
results = pool.map(func, inputs)
pool.close()
pool.join()
return results
if __name__ == '__main__':
series = np.arange(500000)
start = time.clock()
poolAnswer = worker(series)
end = time.clock()
print 'pool time' ,(end - start)
start = time.clock()
answer = map(func,series)
end = time.clock()
print 'map time', (end - start)
結果:
CPU 数 12
プール時間 2.40276007188
D:\poolmap.py:19: RuntimeWarning: long_scalars y=x*x でオーバーフローが発生しました
マップ時間 0.904187849745
##############アップデートこの関数を使用すると、探していた結果が得られました
def func(x):
x=float(x)
y=(((x*x)**0.35))*x+np.ma.sqrt((((x*x)**0.35)))
return y
結果: CPU 数 12
プール時間 12.7410957475
マップ時間 45.4550067581