Angenommen, ich habe einen multiplikativen Ausdruck mit vielen Multiplikanden (kleine Ausdrücke)
%Vor% wobei zum Beispiel c (x-1) ist, d ist (y ** 2-16), k ist (x y-60) ... x, y sind Zahlen
und ich weiß, dass c, d, k, j vielleicht null sind
Ist die Reihenfolge, die ich schreibe der Ausdruck wichtig für eine schnellere Auswertung?
Ist es besser, c d k j .... * w zu schreiben oder python wird alle Ausdrücke auswerten, egal in welcher Reihenfolge ich schreibe?
Python v2.6.5 prüft nicht auf Nullwerte.
%Vor% Update: Ich testete Baldur , und Python kann und wird Code optimieren, der konstante Ausdrücke beinhaltet. Das seltsame ist, dass test6
nicht optimiert ist.
Wenn der Ausdruck Variablen enthält, spielt die Reihenfolge keine Rolle. Alles wird ausgewertet.
Versuchen Sie nicht, vor dem Benchmark zu optimieren.
Vor diesem Hintergrund gilt, dass alle Ausdrücke auch dann ausgewertet werden, wenn ein Zwischenbegriff Null ist.
Die Reihenfolge spielt vielleicht noch eine Rolle. Ausdrücke werden von links nach rechts ausgewertet . Wenn a,b,c,...
sehr große Zahlen sind, könnten sie Python zwingen, viel Speicher zuzuweisen, was die Berechnung verlangsamt, bevor es zu j=0
kommt. (Wenn j=0
früher im Ausdruck vorkommt, würde das Produkt niemals so groß werden und es wäre keine zusätzliche Speicherzuweisung erforderlich.)
Wenn nach dem Timing der Code mit timeit oder cProfile , Sie denken, dies könnte Ihre Situation sein, dann könnten Sie versuchen, c,d,k,j
vorzuspiegeln und
Dann tippe dies auch mit timeit
oder cProfile
. Die einzige Möglichkeit, wirklich festzustellen, ob dies in Ihrer Situation nützlich ist, ist der Benchmark.
Obwohl PyPy viel schneller ist, scheint es das auch nicht zu optimieren:
%Vor%Dies ist nur eine kurze Überprüfung in Python 3.1:
%Vor%und das in Python 2.6:
%Vor%Also die Reihenfolge geht hinein.
Auch ich habe dieses Ergebnis in Python 3.1:
%Vor%Warum auf der Erde?
Wahrscheinlich nicht. Multiplikation ist eine der günstigsten Operationen von allen. Wenn eine 0 schneller sein sollte, dann wäre es notwendig vorher nach Nullen zu suchen und das ist wahrscheinlich langsamer als nur die Multiplikation durchzuführen.
Die schnellste Lösung sollte multiply.reduce()
Tags und Links python optimization math evaluation