並列について理解を深めるために、さまざまなコードのセットを比較しています。
これが基本的なもの (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 を間違った方法で使用していますか? はいの場合、正しい方法は何ですか?
注:この特定のケースまたは他の特定の具体的なケースと相談してください。一般的に話さないでください。