2017-01-10 6 views
1

これは重複しない質問です。関数の実行方法の違いによるパフォーマンスの違い

私はシンプル方法で、かつマルチプロセッシング方法でのPython 3.4.2で同じ機能を実行したと私は簡単な方法は高速であることがわかりました。おそらく私のデザインは良くありませんが、どこに問題があるのか​​わかりません。以下は

私のコードです:

共通部分

import os 
import math 
from multiprocessing import Process 
import timeit 


def exponential(number): 
    """ 
    A function that returns exponential 
    """ 
    result = math.exp(number) 
    proc = os.getpid() 

シンプルなソリューション

if __name__ == '__main__': 

    start = timeit.default_timer() 
    numbers = [5, 10, 20, 30, 40, 50, 60] 

    for index, number in enumerate(numbers): 
     exponential(number) 

    stop = timeit.default_timer() 
    duration = stop - start 
    print(duration) 

マルチプロセッシング・ソリューション

if __name__ == '__main__': 
    start = timeit.default_timer() 
    numbers = [5, 10, 20, 30, 40, 50, 60] 
    procs = [] 

    for index, number in enumerate(numbers): 
     proc = Process(target=exponential, args=(number,)) 
     procs.append(proc) 
     proc.start() 

    for proc in procs: 
     proc.join() 

    stop = timeit.default_timer() 
    duration = stop - start 
    print(duration) 

私は何を見ることは簡単な解決策は、マルチプロセッシング1よりも高速であるということである。

Duration with Simple solution:   2.8359994757920504e-05 
Duration with Multi processing solution: 0.012581961986143142 
+5

複数のプロセスを設定する際にオーバーヘッドがあります。この場合、単純な解決策は非常に迅速であり、そのような小さいセットサイズのためのマルチプロセッシングへの切り替えは利点を示さない。数字の長さが増えるにつれて、これが変わる可能性があります*。 – nbryans

+0

なぜ 'enumerate()'を使うのですか?あなたは決して 'index'変数を使うことはありません。 – reynoldsnlp

+1

ありがとう@nbryans –

答えて

1

X を、コンピューティング(それはあなたのケースであるように)、特に難しいことではありません。ですから、これらを並列に計算しても明確な利点はありません。

最後に、あなたは新しいプロセスの作成について語ったことに何かがあります

など、あなたが複数のプロセスを設定するとき、あなたはまた、メモリ空間上で新しいプロセスを作成するオーバーヘッド、およびコピーを被ることに注意してくださいそのリスト内の各番号に対してそのリストに100個の数字がある場合は、100個の新しいプロセスを作成し、4または8コア(CPUに応じて)で時間を争います。これにより、さらに遅延が生じます(特に、 )。プロセスのプールを作成し、データセットを増分的に処理する方がよいでしょう。

import math 
import multiprocess as mp 


def slave(qIn, qOut): 
    for i, num in iter(qIn.get, None): 
     qOut.put((i, math.exp(num)) 
    qOut.put(None) 


def master(): 
    numbers = [5, 10, 20, 30, 40, 50, 60] 

    qIn, qOut = [mp.Queue() for _ in range(2)] 
    procs = [mp.Process(target=slave, args=(qIn, qOut)) for _ in range(mp.cpu_count()-1)] 
    for p in procs: p.start() 
    for t in enumerate(numbers): qIn.put(t) 
    for p in procs: qIn.put(None) 

    answer = [None] * len(numbers) 
    done = 0 
    while done < len(numProcs): 
     t = qOut.get() 
     if t is None: 
      done += 1 
      continue 

     i, e = t 
     answer[i] = e 

    for p in procs: p.terminate() 
    return answer 
関連する問題