Schleife über Sympy-Ausdruck beschleunigen
Verfasst: Donnerstag 20. September 2012, 11:25
Hallo, ich bin Neuling in Sachen Python und benutze es dazu naturwissenschaftliche Rechnungen durchzuführen.
Was ich tun muss ist Wigner 3j Symbole ausrechnen (sympy.physics.wigner.wigner_3j) und anschließend über einen Index summieren. Die Summation scheint ein Performancefresser zu sein und ich würde es gerne durch eine Array-Operation ersetzen.
Beispielcode:
Die for-Schleife würde ich jetzt natürlich gerne vermeiden, in dem ich wigner_3j auf ein Array aus Integers (meinen lss) anwende und anschließend ein .sum() durchführe.
Hat jemand eine Idee, wie ich das schaffe, oder welche schnelleren Alternativen es gibt?
Eine Idee von mir war bisher das Wignersymbol zu "lambdifien", um es auf ein Array anwenden zu können, aber das habe ich nicht hinbekommen.
[EDIT] Was ich verschwiegen hatte ist, dass ich die gleichen Wigner-Symbole am laufenden Band für unterschiedliche Elemente einer Matrix berechne. Mein Performanceproblem ist also bereits gelöst, wenn ich einmal alle benötigten Wigner-Symbole berechne und diese in einem Array-speichere... so kann ich einfach Funktionen auf dieses Array verweisen, wenn sie ein 3j brauchen.
Was ich tun muss ist Wigner 3j Symbole ausrechnen (sympy.physics.wigner.wigner_3j) und anschließend über einen Index summieren. Die Summation scheint ein Performancefresser zu sein und ich würde es gerne durch eine Array-Operation ersetzen.
Beispielcode:
Code: Alles auswählen
from sympy.physics.wigner import wigner_3j
def funktion(l,ls,m):
min=abs(l-ls) # l und ls sind positive Integer
max=l+ls
U=0
for lss in xrange(min, max):
U+=wigner_3j( l , ls , lss , m , -m , 0 )
return U
funktion(10,4,0) # Beispiel
Hat jemand eine Idee, wie ich das schaffe, oder welche schnelleren Alternativen es gibt?
Eine Idee von mir war bisher das Wignersymbol zu "lambdifien", um es auf ein Array anwenden zu können, aber das habe ich nicht hinbekommen.
[EDIT] Was ich verschwiegen hatte ist, dass ich die gleichen Wigner-Symbole am laufenden Band für unterschiedliche Elemente einer Matrix berechne. Mein Performanceproblem ist also bereits gelöst, wenn ich einmal alle benötigten Wigner-Symbole berechne und diese in einem Array-speichere... so kann ich einfach Funktionen auf dieses Array verweisen, wenn sie ein 3j brauchen.