6

私のコンピューターで Python のマルチプロセッシングをテストするために、このコードを少し書きました。

from multiprocessing import Pool

var = range(5000000)
def test_func(i):
    return i+1

if __name__ == '__main__':
    p = Pool()
    var = p.map(test_func, var)

Unix の time コマンドを使用してこれを計測したところ、結果は次のようになりました。

real 0m2.914s
user 0m4.705s
sys  0m1.406s

次に、同じものを使用して、var時間を計りましたtest_func()

var = map(test_func, var)

そして結果は

real 0m1.785s
user 0m1.548s
sys  0m0.214s

マルチプロセッシング コードは従来のものよりもはるかに高速であるべきではありませんmapか?

4

2 に答える 2

7

なぜそうすべきなのか。

map 関数では、関数を順番に呼び出すだけです。

マルチプロセッシング プールは、タスクがマップされる一連のワーカーを作成します。これらの機能を実行するために、複数のワーカー プロセスを調整しています。

関数内でいくつかの重要な作業を行ってから時間を計り、マルチプロセッシングが計算の高速化に役立つかどうかを確認してください。

マルチプロセッシングを使用するとオーバーヘッドが発生することを理解する必要があります。コンピューティングの労力がこれらのオーバーヘッドよりも大幅に大きい場合にのみ、その利点が見られます。

Hellmann による優れた紹介の最後の例を参照してください: http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html

pool_size = multiprocessing.cpu_count() * 2
pool = multiprocessing.Pool(processes=pool_size,
                            initializer=start_process,
                            maxtasksperchild=2,
                            )
pool_outputs = pool.map(do_calculation, inputs)

所有しているコアに応じてプールを作成します。

于 2012-06-27T15:28:14.023 に答える
3

並列化の使用にはオーバーヘッドがあります。各作業単位がオーバーヘッドを補うのに十分な時間がかかる場合にのみ利点があります。

また、マシンに CPU (または CPU スレッド) が 1 つしかない場合は、並列化を使用しても意味がありません。少なくとも 1 台のハイパースレッディング マシンまたは少なくとも 2 つの CPU コアがある場合にのみ、利益が見られます。

あなたの場合、単純な追加操作ではそのオーバーヘッドが補償されません。

次のようなもう少しコストのかかるものを試してください。

from multiprocessing import Pool
import math

def test_func(i):
    j = 0
    for x in xrange(1000000):
        j += math.atan2(i, i)
    return j

if __name__ == '__main__':
    var = range(500)
    p = Pool()
    var = p.map(test_func, var)
于 2012-06-27T15:38:29.017 に答える