python - 如何将 **kwargs 传递给另一个函数,该函数的值已更改?
问题描述
我有以下函数来计算激光束在腔中的传播。它取决于存储在名为 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)
这很好用。
现在,我将编写一个函数,将该函数传递给 a 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
解决方案
您正在寻找迭代笛卡尔积。
这是一种迭代笛卡尔的方法。
from itertools import product
import numpy as np
L1=np.linspace(1, 2, 2)
M5=np.linspace(16, 17, 2)
dconf = dict(data=5)
size = L1.size
loop_size = size**2
def propagate(N, data, modifiers):
data.update(modifiers)
out = []
for i in range(N):
out.append('%s : %s : %s : %s'%(i, *data.values()))
return out
mod = (dict(L1=i, M5=j) for i, j in product(L1, M5))
m = map(propagate, np.arange(2, 2+loop_size), (dconf,)*loop_size, mod)
for outer in m:
for inner in outer:
print(inner)
这你可以适应你的代码,如果你真的需要并行化(这意味着在核心之间的信息拆分方面),可以看看 Dask。
希望这足以让你继续前进。
编辑:您的问题实际上很难确定。您的问题真的是如何实现简单的“函数调用”吗?我想一个答案就是制作一个包装功能,比如......
def propagate(N, data, modifiers):
...
def call_propagate(N, data, L1_, M5_):
mod = ...
m = map(...
return m
for outer in call_propagate(1000, dconf, L1, M5)
for inner in outer:
print(inner)
推荐阅读
- android - WebView - 将响应式站点显示为桌面
- ruby-on-rails - 测试“ActionMailer::Base.deliveries.size”是什么意思?
- extjs - 切换选项卡时 EXTJS 存储相关错误:ext-all-debug.js:53117 Uncaught TypeError: Cannot read property 'isSynchronous' of null
- html - 在文本下方创建下划线
- ansible - 为什么使用 OpenStack-Ansible 安装时管理容器没有收到 IP-s?
- cuda - 删除 CUDA 10.0 并在 Ubuntu 18.04 上安装 CUDA 9.2
- python - 在 gnu radio 中为 python 块设置元素数
- php - 几种形式的逻辑,Laravel
- asp.net - 将资源文件用于 HTML 中的元内容
- r - stat_density2d - 图例是什么意思?