Я хочу построить словарь оценок функций параллельно, но я изо всех сил пытаюсь выяснить, как это сделать эффективно.
Возьмем случайную матрицу:
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) Как лучше всего это реализовать с помощью многопроцессорного модуля?