3

長いシリーズに複雑な関数を適用する必要があります。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

4

0 に答える 0