首页 > 解决方案 > 如何有效地使用多处理来加速大量微小的任务?

问题描述

我在 Python 中遇到了一些麻烦multiprocessing.Pool。我有两个numpy数组列表ab,其中

a.shape=(10000,3)b.shape=(1000000000,3)

然后我有一个函数可以做一些计算,比如

def role(array, point):
    sub = array-point
    return (1/(np.sqrt(np.min(np.sum(sub*sub, axis=-1)))+0.001)**2)

接下来,我需要计算

[role(a, point) for point in b]

为了加快速度,我尝试使用

    cpu_num = 4
    m = multiprocessing.Pool(cpu_num)
    cost_list = m.starmap(role, [(a, point) for point in b])
    m.close

整个过程大约需要70s,但如果我设置cpu_num = 1,处理时间减少到60s...我的笔记本电脑有6核,供参考。

这里我有两个问题:

  1. 我做错了multiprocessing.Pool什么吗?如果我设置,为什么处理时间会增加cpu_num = 4
  2. 对于这样的任务(每个 for 循环都是一个非常小的过程),我应该使用多处理来加速吗?我觉得每次python填充Pool都比处理函数花费的时间长role...

任何建议都非常受欢迎。

标签: pythonmultithreadingvectorization

解决方案


如果任务太小,那么多处理开销将成为您的瓶颈,您将一无所获。

如果您必须传递给工作人员或工作人员必须返回的每个任务的数据量,那么您也不会赢得很多(甚至什么都没有)

如果您有 10.000 个小任务,那么我建议您创建一个元任务列表。每个元任务将包括执行例如 20 个小任务。

meta_tasks = []
for idx in range(0, len(tiny_tasks), 20):
    meta_tasks.append(tiny_tasks[idx:idx+20])

然后将元任务传递到您的工作池。


推荐阅读