У меня есть следующая функция, которая рассчитывает распространение лазерного луча в резонаторе. Это зависит от многих параметров, которые хранятся в файле dict core_data
, который является базовым набором параметров.
def propagate(N, core_data, **ddata):
cd = copy.deepcopy(core_data) # use initial configuration
cd.update(ddata) # update with data I want to change
cavity = get_new_cavity(cd) # get new cavity object
P = []
for i in range(N):
cavity.evolve(1)
P.append(cavity.get_power())
return P
Если я хочу изменить параметр и увидеть его влияние на лазер, я могу просто вызвать функцию, например,
P0 = propagate(1000, core_data, L1=1.2, M5=17)
Это работает очень хорошо.
Теперь я бы написал функцию, которая передает эту функцию в ProcessPoolExecutor
, при этом значения **ddata
повторяются с использованием того же ключа. Это должно работать, например, так (более простой пример):
propagate_parallel(1000, core_data,
L1=np.linspace(1, 2, 2),
M5=np.linspace(16, 17, 2))
А затем следует сделать это параллельно:
propagate(1000, core_data, L1=1, M5=16)
propagate(1000, core_data, L1=1, M5=17)
propagate(1000, core_data, L1=2, M5=16)
propagate(1000, core_data, L1=2, M5=17)
Что-то вроде этого работает для моего случая:
xrng = np.linspace(110e-30, 150e-30, Nx)
yrng = np.linspace(6.6e-9, 6.7e-9, Ny)
futures = []
with confu.ProcessPoolExecutor(max_workers=Ncores) as pool:
for y, x in it.product(yrng, xrng):
futures.append(pool.submit(propagate, RTs=1000,
core_data=core_data,
gdd_dm=x, dwl_filt=y))
Проблема в том, что это не гибко, и я не могу передать это в хорошую функцию, как написано выше. Это должна быть функция, которую можно вызывать так, чтобы воспроизвести код сверху:
propagate_parallel(1000, core_data, gdd_dm=xrng, dwl_filt=yrng)
Как бы я передал ключи от **ddata
с повторяющимися значениями этого соответствующего ключа?
К вашему сведению, я использовал:
import numpy as np
import concurrent.futures as confu
import itertools as it