为了更好地理解并行,我比较了一组不同的代码。
这是基本的(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?如果是,正确的方法是什么?
注:请与本案例或其他具体具体案例讨论。请不要泛泛而谈。