我有一个相对简单的可并行化的问题,这导致我有效地实施太多问题。我的程序的核心是两个矩阵和两个向量,一个矩阵和向量,用于我希望执行的两个计算。
在代码中,这意味着我有
import numpy as np
matrices = dict([("type1", np.random.rand(10,10)), ("type2", np.random.rand(10,10))])
vectors = dict([("type1", np.random.rand(10)), ("type2", np.random.rand(10))])
我想做的事情(不是真的,但在简化的情况下)是:
我有一个非常大的每种类型的向量列表:
input_vectors = [np.random.rand(10) for i in range(1000)]
我希望计算A*v+b
,其中A
是矩阵,b
是每种类型的向量。
因此,我需要的单线程代码是
def f(input_vector, matricx, vector):
return np.dot(matrix, input_vector) + vector
results = {}
for type in ['type1', 'type2']:
results[type] = []
for input_vector in input_vectors:
results.append(f(input_vector, matrices[type], vectors[type]))
但是,我想并行执行此操作。但是,我不知道如何解决我想要映射到矢量列表上的函数作为输入而不仅仅是矢量的问题。
我想写点像
from multiprocessing import Pool
p = Pool(4)
for type in types:
p.map(lambda x: f(x, matrices[type], vectors[type] , input_vectors))
然而,这不起作用,因为lambda函数不能被pickle。有效的一件事是将我想要乘以的矩阵附加到每个向量,但这当然在记忆方面是不可行的。
关于如何优雅地解决我的难题的任何想法?
我希望池的每个元素都有一个矩阵的副本和它必须乘以的向量,但我不知道如何在multiprocessing
中执行此操作。
答案 0 :(得分:3)
使用functools.partial
将多个参数传递给map
:
def f(matrix, vector, input_vector):
return np.dot(matrix, input_vector) + vector
results = {}
for type_ in types:
func = partial(f, matrices[type_], vectors[type_])
results[type_] = p.map(func, input_vectors)
如果您希望在启动matrices
时将整个vectors
和Pool
列表传递给每个孩子,请在致电type
时通过map
{1}},你也可以这样做。使用initializer
的{{1}} / initargs
参数传递列表,然后在multiprocessing.Pool
函数中将它们设为全局。这将使它们在每个子进程中都是全局的:
initializer