В настоящее время у меня есть функция optimizer()
, которая минимизирует некоторую ошибку и возвращает 100x100
матрицу параметров M
:
def optimizer(M):
# some nondeterministic optimization of parameter matrix M
return M
Этот процесс занимает около минуты и вызывается n_steps
разв петле.
for step in range(n_steps):
M = optimizer(M)
Чтобы ускорить процесс, я хочу распараллелить эту функцию так, чтобы я мог использовать все ядра, которые мне нужно сделать, в идеальном случае в number_of_processors
раз больше работы за одно и то же время.
Я хотел бы знать, какой подход лучше, и если есть подход, о котором я не задумывался, или если я полностью неправильно понял некоторые концепции многопроцессорного пакета.
import multiprocessing as mp
n_cores = 4
pool = mp.Pool(processes = n_cores)
for step in range(n_steps):
M_tmp = [pool.apply_async(optimizer, args=(M,)) for p in range(n_cores)]
M_tmp = [m.get() for m in M_tmp]
M = test_parameters(M_tmp)
Здесь четыре вместо одного рабочегооптимизирует матрицу M
и возвращает оптимизированную версию. M_tmp
содержит n_cores
матрицы, которые затем сравниваются в test_parameters()
. Матрица с лучшими свойствами затем выбирается и возвращается.
Другой подход, о котором я думал, очень похож и использует pool.map()
import multiprocessing as mp
n_cores = 4
pool = mp.Pool(processes = n_cores)
for step in range(n_steps):
M_tmp = pool.map(optimizer, [M for p in range(n_cores)])
M = test_parameters(M_tmp)
Прямо сейчас, я не знаюкакой подход взять. Есть предложения?