2015-11-18 13 views
14

私は単純な例で並列ループを実行しようとしています。
何が間違っていますか?並列ループの作成

from joblib import Parallel, delayed 
import multiprocessing 

def processInput(i): 
     return i * i 

if __name__ == '__main__': 

    # what are your inputs, and what operation do you want to 
    # perform on each input. For example... 
    inputs = range(1000000)  

    num_cores = multiprocessing.cpu_count() 

    results = Parallel(n_jobs=4)(delayed(processInput)(i) for i in inputs) 

    print(results) 

コードの問題は、Python 3のWindows環境で実行されたとき、それは並列ジョブを実行するためのpythonのnum_coresインスタンスを開くが、一方のみがアクティブであることです。これは、プロセッサの動作が14%ではなく100%(i7 - 8論理コアの下)でなければならないため、そうではありません。

追加のインスタンスが何もしないのはなぜですか?

+0

エラーメッセージが表示されますか?それは私のためにうまくいく...。インデントは1つではなく4つのスペースにする必要があります。 –

+0

私は同じ問題があります。問題は、コードがnコアではなく1つのコアでのみ実行されることです。 –

答えて

17

作業マルチプロセッシング・コードを提供するために、あなたの要求に続いて、私は(あなたがpool_mapを使用することを示唆しています遅れた機能性が重要でない場合)、私はあなたに例を挙げます。あなたがpython3に取り組んでいれば、starmapを使うことができます。 返された結果の順序が入力の順序に対応している必要がない場合は、map_sync/starmap_asyncを使用することもできます。

import multiprocessing as mp 

def processInput(i): 
     return i * i 

if __name__ == '__main__': 

    # what are your inputs, and what operation do you want to 
    # perform on each input. For example... 
    inputs = range(1000000) 
    # removing processes argument makes the code run on all available cores 
    pool = mp.Pool(processes=4) 
    results = pool.map(processInput, inputs) 
    print(results) 
+0

私はこれの単純さが大好きなので、試しました。私はTypeErrorを取得します: '_io.TextIOWrapper'オブジェクトをシリアル化できません。私の機能は複雑で、私はそれに潜入する時間がありません。あなたが複雑な機能を持っているかどうかについてのコメントです。これは箱の中ではうまくいきません。 – Nick

+0

シリアライゼーションは、各マルチプロセスプログラムの大部分です。このような問題を解決するには、複雑な関数を調べて、実際にマルチプロセッシングソリューションが必要な部分をチェックし、複雑な関数からデカップリングすることをお勧めします。 – Fanchi

2

Windowsでは、マルチプロセッシングモジュールは 'spawn'メソッドを使用して、複数のPythonインタプリタプロセスを起動します。これは比較的遅いです。 Parallelはコードを実行することに精通しています。特に、バッチサイズを調整しようとするので、バッチ処理に約0.5秒かかります。

を(https://pythonhosted.org/joblib/parallel.htmlでBATCH_SIZE引数を参照してください)あなたのprocessInput()機能は、パラレル、複数のPythonインタプリタをスピンアップし、並行してコードを実行するよりも、1つのプロセッサ上で逐次ジョブを実行するために高速であると判断したことを非常に高速に実行されます。

例を強制的に複数のコアで実行する場合は、batch_sizeを1000に設定するか、processInput()をより複雑にして実行に時間がかかります。

編集:(7私は窓を使用しています)、使用中の複数のプロセスを示して窓に取り組ん例:

from joblib import Parallel, delayed 
from os import getpid 

def modfib(n): 
    # print the process id to see that multiple processes are used, and 
    # re-used during the job. 
    if n%400 == 0: 
     print(getpid(), n) 

    # fibonacci sequence mod 1000000 
    a,b = 0,1 
    for i in range(n): 
     a,b = b,(a+b)%1000000 
    return b 

if __name__ == "__main__": 
    Parallel(n_jobs=-1, verbose=5)(delayed(modfib)(j) for j in range(1000, 4000)) 
+0

タスクが効果的に並行して実行されるようにコードの変更を提案できますか?上記のコードはjoblibの使用例として与えられているので、実際に動作する例があるはずです。 –

関連する問題