我有一个问题,类似于以下内容:

import numpy as np

C = np.zeros((100,10))

for i in range(10):
    C_sub = get_sub_matrix_C(i, other_args) # shape 10x10
    C[i*10:(i+1)*10,:10] = C_sub

因此,显然无需将其作为串行计算来运行,因为每个子矩阵都可以独立计算。
我想使用多处理模块,并为for循环最多创建4个进程。
我阅读了一些有关多处理的教程,但无法弄清楚如何使用它来解决我的问题。

谢谢你的帮助

最佳答案

并行化该代码的一种简单方法是使用进程的 Pool :

pool = multiprocessing.Pool()
results = pool.starmap(get_sub_matrix_C, ((i, other_args) for i in range(10)))

for i, res in enumerate(results):
    C[i*10:(i+1)*10,:10] = res

我使用了 starmap ,因为get_sub_matrix_C函数具有多个参数(starmap(f, [(x1, ..., xN)])称为f(x1, ..., xN))。

但是请注意,序列化/反序列化可能会花费大量时间和空间,因此您可能必须使用更底层的解决方案来避免这种开销。

看来您正在运行python的过时版本。您可以将starmap替换为普通的map,但随后必须提供一个带有单个参数的函数:
def f(args):
    return get_sub_matrix_C(*args)

pool = multiprocessing.Pool()
results = pool.map(f, ((i, other_args) for i in range(10)))

for i, res in enumerate(results):
    C[i*10:(i+1)*10,:10] = res

10-01 13:16