私は、最適化関数scipy.optimize.rootを含むPythonのforループを持っています。機能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
ループを並列化しようとしています。しかし、私はそれがこのような構造で使用することができるように上記for
ループを記述するためにsol
出力を、どのように対処するかどうかはわかりません:ノレンロイヤリティによって答えとして与えられた
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 for serial for)コードに最小限の変更を加えたいと思っています。
'' run(jj) '関数の中に' x0'、 'alist'、' blist'を置かなければなりませんか?そして 'xlist = ylist = zlist = np.zeros(10)'は 'p = Pool(4)'の直前でなければなりません。 –
Nopeと仮定します。これらの定義は、 '' root2d''の関数定義を含めて、私が ''あなたの宣言はここに行こうとしています。 ''のところにあります。 –
奇妙です...私はそれをするとエラーになります: 'AttributeError:module '__main__' has has属性 '__spec __' ' –