我想以并行的方式构建功能评价的字典,但是我正在努力寻找如何有效地做到这一点。
以随机构造的矩阵为例:
import functools
import multiprocessing
import numpy as np
import time
#generate random symmetric matrix
N = 500
b = np.random.random_integers(-2000,2000,size=(N,N))
b_symm = (b + b.T)/2
#identity matrix
ident = np.eye(N)
# define worker function:
def func(w, b_mat):
if w !=0:
L = np.linalg.inv(1j * w * ident - b_mat)
else:
L = np.linalg.pinv(-b_mat)
return L
我现在想对w
的许多值进行采样,并构造一个输出字典。这将是一个令人尴尬的并行问题。我可以使用共享字典来完成此任务,例如:
def dict_builder(w, d):
d[w] = func(w, b_symm)
manager = multiprocessing.Manager()
val_dict = manager.dict()
wrange = np.linspace(-10,10,200)
processors=2
pool = multiprocessing.Pool(processors)
st = time.time()
data = pool.map(functools.partial(dict_builder, d= val_dict), wrange,2)
pool.close()
pool.join()
en = time.time()
print("parallel test took ",en - st," seconds.")
但是,这似乎比必需的更为复杂,因为我仅在唯一的点评估函数,并且具有共享内存对象的开销。
我想将wrange
分成n个块,其中n是处理器的数量,独立构建n个字典,然后将它们组合成一个字典。所以有两个问题:1)这在计算上会有利吗? 2)使用多处理模块实现此目的的最佳方法是什么?