我在Python中有一個for循環,其中包含優化函數scipy.optimize.root。描述優化結果的功能outputs類對象(稱爲sol
):使用Python類對象進行並行處理
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)))
這是給定爲由諾倫版稅答案。
編輯:我想要一個HPC集羣,其中可用的Python模塊是numpy的,SciPy的,matplotlib,用Cython和mpi4py上運行我的程序(沒有這個MWE)。雖然有很多方法可以執行並行處理,但我想對現有的(串行for循環)代碼做最小的更改。
應該'x0','alist','blist'是'運行(JJ)'函數裏面?而'xlist = ylist = zlist = np.zeros(10)'應該在'p = Pool(4)'之前,我假設 –
沒有。所有這些定義,包括''root2d''的函數定義都放在我放''#你的聲明去了'的地方'' –
奇怪......當我這樣做時,我只是得到一個錯誤:'AttributeError:module'__main__'has沒有屬性'__spec __'' –