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个处理器并行进行计算吗?
简短回答:是的,操作通常在可用内核(的一部分)上完成.但是通信开销很大.在您的示例中,与开销相比,工作负载太小.
如果您构建池,将构建一些工作者.如果你然后指示map给出输入.发生以下情况:
现在,拆分,通信和连接数据是主进程执行的所有进程.这些不能并行化.由于操作很快(输入大小为n的O(n)),因此开销具有相同的时间复杂度.
即使你拥有数百万个内核,这也很复杂,因为通信列表可能已经比计算结果更昂贵了.
这就是为什么你应该并行计算昂贵的任务.不是简单的任务.与通信量相比,处理量应该很大.
在您的示例中,工作是微不足道的:您将1添加到所有元素.然而,序列化不那么简单:您必须对发送给工作者的列表进行编码.
| 归档时间: |
|
| 查看次数: |
2738 次 |
| 最近记录: |