Ich habe ein kleines Performance Problem das wohl durch verschachtelte Schleifen verursacht wird. Ich versuche das Problem mal mit einem vereinfachten Beispiel zu erläutern. In meinem reellen Problem (post-processing) berechne ich die Geschwindigkeit an den Integrationspunkten in einem FEM/FVM - Netz. Die Schleife geht über die Knoten des Elements und die verschiedenen betrachteten Bilanzgleichungen.
Ich versuche es mit einem vereinfachten Beispiel. Ich habe eine Schleife über Autos und für jedes Auto berechne ich verschiedene Werte für jeden einzelnen Reifen.
Code: Alles auswählen
for i in xrange(nAutos):
for j in xrange(nReifen):
... berechne Druck am Reifen j
.... berechne viele Sachen an jedem Reifen j....
Wenn die Zahl der Autos gering ist und die Anzahl der Reifen auch kann ich theoretisch denk Code doppelt schreiben und nur über die nAutos iterieren.
Code: Alles auswählen
for i in xrange(nAutos):
.... berechne Druck an Reifen a
.... berechne Druck an Reifen b
.... berechne viele Sachen an jedem Reifen ....
.... berechne Druck wäre jetzt eine einfache Formel, wobei ich pro Reifen sehr viele Sachen berechnen würde die aber bei jedem Reifen immer Identisch sind. Die zweite Variante verwendet doppelten Code was nicht besonders schön ist gerade wenn die Anzahl der Reifen variabel ist. Der Unterschied zwischen beiden Varianten ist enorm. Die schnelle Version braucht 6 Sekunden die langsame über 10 Sekunden. Zeitfresser ist ganz klar dieser Programmteil. Von der Klarheit des Codes und Allgemeingültigkeit her ist Variante 1 aber auf jeden Fall zu bevorzugen,...
Mein Ziel ist es unter 1 Sekunde zu kommen

(wohl hoffnungslos) was immer noch viel langsamer als das C++ ist das die eigentlichen Berechnungen macht. Bin schon am überlegen nach einem fertigen Prototyping auf C++ umzusteigen. Auslagern in C wird wohl nicht sooo viel an Performance bringen wie ich bräuchte zumal ich schon Numpy für die meisten Berechnungen verwende.
Vielleicht habt ihr ja noch irgendwelche klugen Ratschläge wie ich das Programm doch noch schneller bekomme.