【发布时间】:2017-04-10 09:30:08
【问题描述】:
我在 Python 中有一个 for 循环,其中包含优化函数 scipy.optimize.root。函数outputs是一个描述优化结果的类对象(称为sol):
import numpy as np
import scipy.optimize as so
def root2d(x,a,b):
F1 = np.exp(-np.exp(-(x[0]+x[1]))) - x[1]*(b+x[0]**2)
F2 = x[0]*np.cos(x[1]) + x[1]*np.sin(x[0]) - a
return (F1,F2)
x0 = np.array([0.1,0.1]) # initial guess
alist = np.linspace(-0.5,-0.3,10)
blist = np.linspace(0.2,0.3,10)
xlist = np.zeros(10)
ylist = np.zeros(10)
zlist = np.zeros(10)
for jj in range(0,10):
a = alist[jj]
b = blist[jj]
sol = so.root(root2d,x0,args=(a,b),method='lm',tol=1e-9)
xlist[jj] = sol.x[0] # optimised value
ylist[jj] = sol.x[1] # optimised value
zlist[jj] = sol.success # was solver successful?
# do something with xlist ylist zlist
现在我正在尝试使用this post 中的建议并行化for 循环。但是我不确定如何处理sol 输出以及如何编写上面的for 循环以便可以在这种结构中使用它:
from multiprocessing import Pool
p = Pool(4)
xlist,ylist,zlist = zip(*p.map(so.root,range(0,10)))
这是诺伦皇室的回答。
编辑:我想在可用 Python 模块为 numpy、scipy、matplotlib、cython 和 mpi4py 的 HPC 集群上运行我的程序(没有这个 MWE)。尽管有许多方法可以进行并行处理,但我想对现有(串行 for 循环)代码进行最小的更改。
【问题讨论】:
标签: python numpy optimization parallel-processing scipy