2

私は子供たちに親の変数に書くようにさせる方法を理解しようとしています。ここで何か間違ったことをしているのかもしれませんが、マルチプロセッシングには実際にかかる時間の何分の1かがかかると想像していました。

import multiprocessing, time

def h(x):
    h.q.put('Doing: ' + str(x))
    return x

def f_init(q):
    h.q = q

def main():
    q = multiprocessing.Queue()
    p = multiprocessing.Pool(None, f_init, [q])
    results = p.imap(h, range(1,5))
    p.close()

- - -結果 - - -:

1
2
3
4
Multiprocessed: 0.0695610046387 seconds
1
2
3
4
Normal: 2.78949737549e-05 seconds # much shorter

    for i in range(len(range(1,5))):
        print results.next() # prints 1, 4, 9, 16

if __name__ == '__main__':
    start = time.time()
    main()
    print "Multiprocessed: %s seconds" % (time.time()-start)             

    start = time.time()
    for i in range(1,5):
        print i
    print "Normal: %s seconds" % (time.time()-start)             
4

1 に答える 1

2

@Blenderは基本的にすでにあなたの質問に答えていますが、コメントとして。機械に関連するオーバーヘッドがあるmultiprocessingため、重要な作業を行わずにオーバーヘッドが発生すると、速度が低下します。

うまく並列化する作業を実際に行ってみてください。たとえば、Pythonコードを記述してファイルを開き、正規表現を使用してスキャンし、一致する行を引き出します。次に、10個の大きなファイルのリストを作成し、マルチプロセッシングとプレーンPythonで10個すべてを実行するのにかかる時間を示します。または、高価な関数を計算するコードを記述して試してみてください。

私はmultiprocessing.Pool()外部プログラムのインスタンスの束を実行するためだけに使用しました。以前subprocessはオーディオエンコーダーを実行していましたが、エンコーダーの4つのインスタンスを同時に実行して、大幅な高速化を実現しました。

于 2012-08-22T06:55:35.130 に答える