【问题标题】:How to Do Data Parallelization in Python?如何在 Python 中进行数据并行化?
【发布时间】:2025-12-23 07:35:11
【问题描述】:

所以,我有 3 维列表。例如:

A=[[[1,2,3],[4,5,6],[7,8,9]],...,[[2,4,1],[1,4,6],[1,2,4]]]

我想独立处理 A 中的每个二维列表,但它们都有相同的过程。如果我按顺序做,我会做:

for i in range(len(A)):
    A[i]=process(A[i])

但是,这需要很长时间。您能告诉我如何通过 Python 中的数据并行化进行并行计算吗?

【问题讨论】:

  • 并行化需要线程化。这需要大量的工作。由于列表是可变的,因此您可能必须为每个单独的线程创建一个副本(如果我擅长编程的话)。与在单个线程中处理相比,复制/切片列表可能需要更多时间。
  • 这里的选项列表...wiki.python.org/moin/ParallelProcessing
  • @Zizouz212 那么,没有比顺序处理更有效的方法了吗?
  • Python 中的线程实际上根本不是并行的,并且会减慢速度,因为无论线程数如何,全局解释器锁一次只执行一条 Python 指令。它只适用于在另一个线程上等待 I/O 时做某事。真正的多处理可以工作,但共享数据需要锁定,并且如果有大量写入数组,也很可能会减慢速度。
  • @cricket_007 谢谢,我试试看。

标签: python python-2.7


【解决方案1】:

如果您有多个内核并且处理每个二维列表是昂贵的操作,您可以使用multiprocessing 中的Pool。这是一个在不同过程中对数字进行平方的简短示例:

import multiprocessing as mp

A = [[[1,2,3],[4,5,6],[7,8,9]],[[2,4,1],[1,4,6],[1,2,4]]]

def square(l):
    return [[x * x for x in sub] for sub in l]

pool = mp.Pool(processes=mp.cpu_count())
res = pool.map(square, A)

print res

输出:

[[[1, 4, 9], [16, 25, 36], [49, 64, 81]], [[4, 16, 1], [1, 16, 36], [1, 4, 16]]]

Pool.map 的行为类似于内置的map,同时将可迭代对象拆分为工作进程。它还有第三个参数chunksize,它定义了有多大的块提交给工人。

【讨论】:

  • 非常感谢!我稍后再试,因为我的程序自 30 分钟前以来仍在按顺序运行。所以,我不必把 A 变成某个部分,python 会分开它吗?
  • @user7077941 不,您不必拆分 A。您可能需要定义名为 chunksize 的第三个参数,但具体取决于您的数据。
  • 哇,好简单的方法。谢谢你。 ^^
  • 嗨,我很困惑。我尝试使用您的代码,但在 mp.Pool(processes=mp.cpu_count()) 作为池时出现了“AttributeError”错误。我该怎么办?
  • @user7077941 没有注意到 python 2.7 标签,所以我用 3.5 运行它,我已经编辑了在 Python 2.7 上工作的答案。