2

並列について理解を深めるために、さまざまなコードのセットを比較しています。

これが基本的なもの (code_piece_1) です。

for ループ

import time

# setup
problem_size = 1e7
items = range(9)

# serial
def counter(num=0):
    junk = 0
    for i in range(int(problem_size)):
        junk += 1
        junk -= 1
    return num

def sum_list(args):
    print("sum_list fn:", args)
    return sum(args)

start = time.time()
summed = sum_list([counter(i) for i in items])
print(summed)
print('for loop {}s'.format(time.time() - start))

このコードは、タイム コンシューマーをシリアル スタイル (for ループ) で実行し、この結果を得ました。

sum_list fn: [0, 1, 2, 3, 4, 5, 6, 7, 8]
36
for loop 8.7735116481781s

マルチプロセッシング

マルチプロセッシング スタイルは、並列コンピューティングを実装する方法と見なすことができますか?

ドキュメントがそう言っているので、私はイエスだと思います。

ここに code_piece_2 があります

import multiprocessing
start = time.time()
pool = multiprocessing.Pool(len(items))
num_to_sum = pool.map(counter, items)
print(sum_list(num_to_sum))
print('pool.map {}s'.format(time.time() - start))

このコードは、マルチプロセッシング スタイルで同時にコンシューマーを実行し、この結果を得ました

sum_list fn: [0, 1, 2, 3, 4, 5, 6, 7, 8]
36
pool.map 1.6011056900024414s

明らかに、この特定のケースでは、マルチプロセッシングの方がシリアルよりも高速です。

ダスク

Daskは、Python で並列計算を行うための柔軟なライブラリです。

このコード (code_piece_3) は、コンシューマと Dask を同時に実行しました (Dask を正しい方法で使用しているかどうかはわかりません)。

@delayed
def counter(num=0):
    junk = 0
    for i in range(int(problem_size)):
        junk += 1
        junk -= 1
    return num
@delayed
def sum_list(args):
    print("sum_list fn:", args)
    return sum(args)

start = time.time()
summed = sum_list([counter(i) for i in items])
print(summed.compute())
print('dask delayed {}s'.format(time.time() - start))

私は得た

sum_list fn: [0, 1, 2, 3, 4, 5, 6, 7, 8]
36
dask delayed 10.288054704666138s

私のCPUには6つの物理コアがあります

質問

マルチプロセッシングの実行速度が非常に速いのに、Dask の実行速度が非常に遅いのはなぜですか?

Dask を間違った方法で使用していますか? はいの場合、正しい方法は何ですか?

注:この特定のケースまたは他の特定の具体的なケースと相談してください。一般的に話さないでください。

4

3 に答える 3