Ich habe eine for-Schleife in Python, die eine Optimierungsfunktion scipy.optimize.root enthält. Die Funktion outputs ein Klassenobjekt (genannt sol
), die die optimierte Ergebnisse beschreibt:Parallele Verarbeitung mit Python-Klassenobjekt
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
Jetzt versuche ich, die for
Schleife mit den Vorschlägen in this post parallelisieren. Allerdings bin ich nicht sicher, wie mit den sol
Ausgaben zu beschäftigen und wie die oben for
Schleife zu schreiben, so dass es in dieser Art von Struktur verwendet werden:
from multiprocessing import Pool
p = Pool(4)
xlist,ylist,zlist = zip(*p.map(so.root,range(0,10)))
, die als Antwort von Nolen Lizenz gegeben wurden.
Edit: Ich möchte mein Programm (nicht diese MWE) auf einem HPC-Cluster, wo die verfügbaren Python-Module sind numpy, scipy, matplotlib, Cython und mpi4py. Obwohl es zahlreiche Methoden für die parallele Verarbeitung gibt, möchte ich nur minimale Änderungen an meinem bestehenden Code (serial for loops) vornehmen.
Sollte 'x0',' alist', 'blist' in der' run (jj) sein 'Funktion? Und die 'xlist = ylist = zlist = np.zeros (10)' sollte kurz vor 'p = Pool (4) sein 'Ich nehme an, –
Nein. All diese Definitionen, einschließlich der Funktionsdefinition von '' root2d'' gehen dahin, wo ich '' # Ihre Deklarationen hingehöre'' –
Seltsam ... Ich bekomme nur einen Fehler wenn ich das tue: 'AttributeError: Modul'__main__ 'hat kein Attribut '__spec __' ' –