Eklatanter Geschwindigkeitsunterschied bei numerischen Berechnungen
Verfasst: Donnerstag 14. November 2024, 18:15
Hallo und Guten Abend zusammen,
Ich bin Johannes (68) aus Neuss am Rhein und habe erst vor etwa 1 Monat begonnen, mich mit Python zu beschäftigen. Ich muss generell sagen, dass mir die Sprache wegen ihrer Leichtigkeit und Klarheit im Aufbau sehr gefällt.
Ich bin Physiker und Mathematiker und somit interessieren mich numerische Berechnungen sehr. Konkret befasse ich mich mit dem Problem der Lösung einer partiellen Differentialgleichung zur Berechnung eines elektrostatischen Feldes mit Randbedingungen (Poisson Gleichung). Nun habe ich bereits 2015 einen Code zur Lösung dieser Gleichung erstellt und zwar in Visual Basic 2010 Express und war mit der Performance immer zufrieden. Und jetzt kam die große Enttäuschung: Das Python Programm ist bei einer identischen Eingabe um gut 50 mal langsamer und das finde ich zu viel! Ich habe mal den zeitkritischen Teil des Codes hier ausgedruckt:
Es wird ein 2D numpy array namens feld1[i,j] über den gezeigten Algorithmus in ein neues array feld1[i,j] übergeführt. Die Felder haben Dimension 500x500. Und die Prozedur wird 200 mal durchlaufen (Relaxationsverfahren). Beide Felder enthalten floating point Zahlen. Es dauert in der Ausführung auf meinem Rechner ca 50 Sekunden. Hier folgt der entsprechende Code in Visual Basic:
und das läuft in ca 1 Sekunde!!!! Auch hier enthalten alle Feldelemente floats (in Double Precision). Dieser Unterschied scheint mir gigantisch und würde andeuten, dass Python für numerische Integrationen etwas komplexerer Systeme ungeeignet ist. Oder übersehe ich etwas Wesentliches? Übrigens erhöht sich auch die Geschwindigkeit nach Compilation mit pyinstaller praktisch nicht. Ich bitte um eure Meinung zu dem Problem!
Liebe Grüße an alle! Johannes
Ich bin Johannes (68) aus Neuss am Rhein und habe erst vor etwa 1 Monat begonnen, mich mit Python zu beschäftigen. Ich muss generell sagen, dass mir die Sprache wegen ihrer Leichtigkeit und Klarheit im Aufbau sehr gefällt.
Ich bin Physiker und Mathematiker und somit interessieren mich numerische Berechnungen sehr. Konkret befasse ich mich mit dem Problem der Lösung einer partiellen Differentialgleichung zur Berechnung eines elektrostatischen Feldes mit Randbedingungen (Poisson Gleichung). Nun habe ich bereits 2015 einen Code zur Lösung dieser Gleichung erstellt und zwar in Visual Basic 2010 Express und war mit der Performance immer zufrieden. Und jetzt kam die große Enttäuschung: Das Python Programm ist bei einer identischen Eingabe um gut 50 mal langsamer und das finde ich zu viel! Ich habe mal den zeitkritischen Teil des Codes hier ausgedruckt:
Code: Alles auswählen
st=500
while count<200:
for i in range(1,st-2):
for j in range(1,st-2):
if check(i,j)==True:
feld1[i,j]=0.125*(feld[i,j+1]+feld[i-1,j+1]+feld[i-1,j]+
feld[i-1,j-1]+feld[i,j-1]+feld[i+1,j-1]+
feld[i+1,j]+feld[i+1,j+1])
else:
feld1[i,j]=feld[i,j]
count=count+1
feld[:,:]=feld1[:,:]
Code: Alles auswählen
For k = 1 To 200
Call iter() 'Aufruf der Relaxationsroutine
Next k
'=============================================================================
'Feldberechnung durch Relaxation ... Jeder Feldpunkt ist arithmetischer Mittelwert der Nachbarn
'=============================================================================
Sub iter()
For i = 1 To 499
For j = 1 To 499
If boundaries(i, j) = False Then
feldr(i, j) = 0.125 * (feld(i - 1, j) + feld(i, j + 1) + feld(i + 1, j) + feld(i, j - 1) +
feld(i - 1, j - 1) + feld(i + 1, j - 1) + feld(i + 1, j + 1) + feld(i - 1, j + 1)) 'Jeder Punkt ist Mittelwert der Nachbarpunkte da Laplace(U(x,y))=0
Else
feldr(i, j) = feld(i, j)
End If
Next
Next
Call neu_alt()
End Sub
Liebe Grüße an alle! Johannes