2016-11-02 4 views
0

私が持っているものは、1秒で10,000回ループすることができる関数です。しかし、私はこの機能を何千億〜何百万回も実行する必要があります。 CPUを使用するオーバーヘッドのために予想通り、ネイティブのmultiprocessingパッケージを4コアで使用すると、10kループが1.5秒遅くなります。 multiprocessingのchunkksizeパラメータを使用することは簡単でした。複数のプロセスがオーバーヘッドよりも高速化された状態でこの関数を呼び出す方法はありますか?Pythonの非常に高速な関数に複数のCPUを使用する

機能の切り捨てられたバージョン:

rands = np.random.random((200, 1000000)) 

def randfunc(i): 
    Q = np.concatenate([rands[:,[i]], rands[:,[i]] * rands[:,[i+1]]],axis=1) 
    Q2 = np.dot(np.transpose(Q),Q) 
    Q3 = np.linalg.inv(Q2) * Q2[1,1] 
    return Q3 
+0

WindowsまたはUnix OSをお使いですか? – Dunes

+0

私はWindowsとUbuntuの両方にアクセスできます – evoclue

答えて

0

が、私は単に機能を並列化する代わりにmultiprocessingパッケージのmap_syncを使用してipyparallelパッケージを使用して半分に実行時間を削減することができました。なぜ前者のパッケージが後者よりもオーバーヘッドが少ないのか分かりませんが、前者の場合、パラレル実行時に変数としてrandsを認識する後者とは異なり、データのロードに時間がかかりました。しかし、どちらの場合もデータはRAMに保存されます。誰かがこれを読んで、なぜipyparallelが速いのかを知っているなら、コメントをしてください。

関連する問題