Ist der multiplikative Ausdruck von Python schneller, wenn er eine Null findet?

8

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?

    
Lord British 16.07.2010, 11:31
quelle

5 Antworten

7

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.

%Vor%

Wenn der Ausdruck Variablen enthält, spielt die Reihenfolge keine Rolle. Alles wird ausgewertet.

    
Nick Dandoulakis 16.07.2010, 11:54
quelle
5

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

testen %Vor%

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.

%Vor%

Obwohl PyPy viel schneller ist, scheint es das auch nicht zu optimieren:

%Vor%     
unutbu 16.07.2010 11:53
quelle
4

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?

    
Iceland_jack 16.07.2010 12:14
quelle
2
%Vor%     
Mykola Kharechko 16.07.2010 11:52
quelle
-1

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()

sein     
Mene 16.07.2010 11:48
quelle