2016-09-29 15 views
-1

私は単純なマルチプロセッシングテストをしていますが、何か問題があるようです。私はこれをi5-6200Uで実行しています。2.3 Ghz with Turbo BoostPythonマルチプロセッシング - 実行時間が長くなりました。何が間違っていますか?

from multiprocessing import Process, Queue 
import time 

def multiply(a,b,que): #add a argument to function for assigning a queue 
    que.put(a*b) #we're putting return value into queue 

if __name__ == '__main__': 
    queue1 = Queue() #create a queue object 
    jobs = [] 
    start_time = time.time() 
#####PARALLEL#################################### 
    for i in range(0,400): 
     p = p = Process(target= multiply, args= (5,i,queue1)) 
     jobs.append(p) 
     p.start() 

    for j in jobs: 
     j.join() 

    print("PARALLEL %s seconds ---" % (time.time() - start_time)) 
#####SERIAL################################ 
    start_time = time.time() 
    for i in range(0,400): 
     multiply(5,i,queue1) 
    print("SERIAL %s seconds ---" % (time.time() - start_time)) 

出力:

PARALLEL 22.12951421737671 seconds --- 
SERIAL 0.004009723663330078 seconds --- 

ヘルプははるかに高く評価されます。

+3

プロセスの作成は、2つの小さな整数を掛けるよりもはるかに高価です。あなたがCPUを悪化させるよりもはるかに多くのプロセスを作ります(すべてのプロセスは、限られたCPUサイクルの間に互いに戦います)。スピードアップを確認するには、各ワーカープロセスで実行される「有益な作業」が重要です(プロセスの作成+破壊やIPC(プロセス間通信)のオーバーヘッドよりも時間がかかります)。 –

+0

なぜ400プロセスを作成し、乗算値をキューに格納するのですか? – haifzhan

+0

これを正しくするにはどうすればいいですか?あなたは私を正しい資源に導くことができますか?私はプールや何かを使っているべきですか?私は本当に混乱しています。私はプロセスの結果を得る必要があるので、値をキューに格納する必要があります。グーグルでは、キューはそれを行う方法と思われました。 – RandN88

答えて

0

ここに、素早いスピードアップを得るための(ばかげた)コードの簡単な例があります。コメントですでに説明したように、プロセスの数が不当に作成されることはなく、プロセス間通信のオーバーヘッドに比べて、リモート関数の呼び出しごとに行われる作業が高くなります。

import multiprocessing as mp 
import time 

def factor(n): 
    for i in range(n): 
     pass 
    return n 

if __name__ == "__main__": 
    ns = range(100000, 110000) 

    s = time.time() 
    p = mp.Pool(4) 
    got = p.map(factor, ns) 
    print(time.time() - s) 
    assert got == list(ns) 

    s = time.time() 
    got = [factor(n) for n in ns] 
    print(time.time() - s) 
    assert got == list(ns) 
+0

ありがとう!これは大いに役立ちます。しかし、nの代わりに2D配列(画像のようなもの)をどのように渡すのですか?それは私がかなり混乱している部分です。そして価値を取り戻すために、私はまだキューを使用する必要がありますか? – RandN88

+0

コードを見てみると、 'factor()'の結果が返されます。私は2D配列(画像のようなもの)が正確に何を意味するのか分かりません。 "2D配列"と "画像"はPythonの型に組み込まれていません。詳細は重要です。要するに、酸洗することができるものは渡すことができます/または返す –

+0

おかげでティム、これは私が多くの助けになります:) – RandN88

関連する問題