为什么多进程池比for循环慢?

Jay*_*Jay 4 python python-multiprocessing

from multiprocessing import Pool

def op1(data):
    return [data[elem] + 1 for elem in range(len(data))]
data = [[elem for elem in range(20)] for elem in range(500000)]

import time

start_time = time.time()
re = []
for data_ in data:
    re.append(op1(data_))

print('--- %s seconds ---' % (time.time() - start_time))

start_time = time.time()
pool = Pool(processes=4)
data = pool.map(op1, data)

print('--- %s seconds ---' % (time.time() - start_time))
Run Code Online (Sandbox Code Playgroud)

我使用池的运行时间比循环运行时慢得多.但是池不应该使用4个处理器并行进行计算吗?

Wil*_*sem 9

简短回答:是的,操作通常在可用内核(的一部分)上完成.但是通信开销很大.在您的示例中,与开销相比,工作负载太小.

如果您构建池,将构建一些工作者.如果你然后指示map给出输入.发生以下情况:

  1. 数据将被拆分:每个工人获得大致公平的份额;
  2. 数据将传达给工人;
  3. 每个工人都会处理他们的工作;
  4. 结果被传达回过程 ; 和
  5. 主进程将结果组合在一起.

现在,拆分,通信和连接数据是主进程执行的所有进程.这些不能并行化.由于操作很快(输入大小为n的O(n)),因此开销具有相同的时间复杂度.

即使你拥有数百万个内核,这也很复杂,因为通信列表可能已经比计算结果更昂贵了.

这就是为什么你应该并行计算昂贵的任务.不是简单的任务.与通信量相比,处理量应该很大.

在您的示例中,工作是微不足道的:您将1添加到所有元素.然而,序列化不那么简单:您必须对发送给工作者的列表进行编码.