【问题标题】:Optimal shape for Multiprocessing Pool.map in PythonPython 中 Multiprocessing Pool.map 的最佳形状
【发布时间】:2023-02-23 06:14:38
【问题描述】:
假设您有一个 MxN 元素矩阵(嵌套列表)。并且您想要并行化操作;因此您的选择是按行并行化或按列并行化。假设数据/操作是独立的并且只需要 matrix[i][j] 的值。
根据 M & N 的规模,最好的分配方式是什么?
我的想法是启动一个进程的开销成本是不平凡的,所以你应该根据 min(M,N) 进行分配
例如,如果有 1000 行和 30 列,最好按列分配(启动进程所需的时间更少)。相反,如果有 30 行和 1000 列,则按行分配。
这种想法合理吗?
【问题讨论】:
标签:
python
multiprocessing
【解决方案1】:
这取决于工作是什么,以及执行一个“工作单元”需要多长时间,例如,如果您只是对两个矩阵求和,那么您根本不需要使用多处理,通常会有永远不要“一刀切”,你能得到的唯一可靠答案是始终进行基准测试以找出答案.
如果您有一个 1000x30 矩阵,那么您就有 30_000 任务,将它们拆分为 1000 个任务或 30 个任务都没有任何意义。
相反,您可以将它们平均分配给您的工作人员,展平阵列并使用 numpy.array_split 将其分成工作人员数量的块并传递它们,这将最大限度地减少序列化开销,并确保每个核心的工作几乎相等。
最佳工人数量也可以通过基准测试获得,但如果您期望任务数量可变,那么您应该定义一定的块大小,例如您将为每 500 个任务生成 1 个工人,并且最多达到CPU,同样,你应该从对你的代码进行基准测试.