我有一个矩阵矩阵,我需要对其进行计算(即 ax x y x z x z 矩阵,我需要对每个 z x z 矩阵执行计算,因此 x*y 总运算)。目前,我正在遍历矩阵的前两个维度并执行计算,但它们是完全独立的。有没有一种方法可以并行计算这些,而无需事先知道会有多少这样的矩阵(即 x 和 y 未知)。
是的; 请参阅多处理模块。这是一个示例(根据文档中的示例进行调整以适合您的用例)。(z = 1
为了简单起见,我在这里假设,因此f
需要一个标量。)
from multiprocessing import Pool
# x = 2, y = 3, z = 1 - needn't be known in advance
matrix = [[1, 2, 3], [4, 5, 6]]
def f(x):
# Your computation for each z-by-z submatrix goes here.
return x**2
with Pool() as p:
flat_results = p.map(f, [x for row in matrix for x in row])
# If you don't need to preserve the x*y shape of the input matrix,
# you can use `flat_results` and skip the rest.
x = len(matrix)
y = len(matrix[0])
results = [flat_results[i*y:(i+1)*y] for i in range(x)]
# Now `results` contains `[[1, 4, 9], [16, 25, 36]]`
这将x * y
在多个进程之间划分计算(每个 CPU 内核一个;这可以通过为 提供参数来调整Pool()
)。
根据您在做什么,请考虑首先使用numpy尝试矢量化操作(而不是 for 循环);您可能会发现它的速度足以使多处理变得不必要。(如果matrix
在这个例子中是一个 numpy 数组,代码就是results = matrix**2
.)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句