2017-12-26 4 views
1

So, soweit ich weiß, gibt es zwei verschiedene Möglichkeiten zu prüfen, ob eine Ganzzahl 0 in Python ist. Wir können entweder tun:Gibt es einen Unterschied in der Überprüfung, ob eine Ganzzahl gleich 0 ist oder nicht Falsch

if i == 0: 
    ... 

oder

if not i: 
    ... 

Die erste könnte argumentiert werden, klarer zu sein, aber es gibt Fälle, in denen sie zu unterschiedlichen Ergebnissen führen oder eine bessere Leistung?

+0

Dies gilt nicht, wenn 'i' eine Ganzzahl ist, aber wenn' i = [] ', dann ist das Verhalten anders. – chrisz

+0

"wenn nicht" überprüft die "truthy", während '==' versucht, den Wert im Allgemeinen zu vergleichen, wenn Sie nur die Truthy "wenn nicht" oder "wenn ich" schneller ist überprüfen möchten – user1767754

+2

Wenn Sie "i" kennen ist eine ganze Zahl, dann gibt es keinen Unterschied. Verwenden Sie, was immer klarer ist. – khelwood

Antwort

2

Ja, es gibt einen Unterschied. Sie können den Byte-Code mit dis dekompilieren, um zu beobachten, was auf der untersten Ebene passiert.

import dis 

dis.dis("if i == 0: pass") 
    1   0 LOAD_NAME    0 (i) 
       3 LOAD_CONST    0 (0) 
       6 COMPARE_OP    2 (==) 
       9 POP_JUMP_IF_FALSE  15 
      12 JUMP_FORWARD    0 (to 15) 
     >> 15 LOAD_CONST    1 (None) 
      18 RETURN_VALUE 

i wird 0 auf den konstanten Wert explizit verglichen, wie Sie auf Linie 6 COMPARE_OP sehen. Inzwischen für den letzteren Fall -

dis.dis("if not i: pass") 
    1   0 LOAD_NAME    0 (i) 
       3 POP_JUMP_IF_TRUE   9 
       6 JUMP_FORWARD    0 (to 9) 
     >> 9 LOAD_CONST    0 (None) 
      12 RETURN_VALUE 

Sie finden das „Truthiness“ von i siehe getestet wird. Alles in Python mit einem Falsch-Y-Wert (0, 0.0, False, leere Strings und leere Container) werden alle als False betrachtet, daher lautet der resultierende Ausdruck True.

Was Sie verwenden, hängt davon ab, was Sie testen möchten. Möchten Sie die Unwahrheit eines Objekts testen? Oder möchten Sie testen, ob der Wert 0 ist? Letzteres ist viel spezifischer und unterscheidet sich geringfügig von einer semantischen Perspektive.

Ach ja, und wenn wir reden Leistung, dann -

%timeit if i == 0: pass 
10000000 loops, best of 3: 51.4 ns per loop 

%timeit if not i: pass 
10000000 loops, best of 3: 39.1 ns per loop 

not i ist nicht nur pythonic, aber schneller (wenn auch nicht viel, und die Ergebnisse auf verschiedenen Maschinen und Python-Versionen können abweichen).

+0

Hmm, können Sie Ihren vollen 'Zeitit' Fall, in meinem Fall' == 'war schneller als mit' wenn nicht ich ' – user1767754

+0

@ user1767754 Ich habe dies in python3.4, Ipython5.2, auf einem MacOSX. Timings variieren wahrscheinlich zwischen Rechnern und Implementierungen. Ich habe diesen Disclaimer hinzugefügt. –

1

speedwise es fast keinen Unterschied, aber == ausgeführt ~3% besser auf meinem System mit 1000 laufen die auf einem 10**7 Vergleichsschleife. Außerdem ist das eine Optimierung, an die man nicht besonders denken sollte, besonders mit Python.

Eine Abfrage wie if not i oder if i überprüft die Truthy des angegebenen Wertes. wobei die Zahl 0 zu false auswertet, alles kleiner oder größer als true. Noch einmal, bevor Sie sich tatsächlich für welche entscheiden, sollten Sie sich die Frage stellen, wenn Sie nach dem truthy oder einem Vergleich mit einem bestimmten Wert suchen.

1
if i == 0 

wird nur wahr, wenn i zu 0 gleich oder wenn i ist False, während

if not i 

wahr sein wird, wenn i 0 ist, wenn iFalse ist, sondern auch, wenn i ist ein leere Sammlung.

Je nachdem, was Sie versuchen zu tun, kann einer besser als der andere sein.

Es kann eine sehr geringe Leistung Vorteil mit der Verwendung der letzteren Lösung sein, aber das ist vernachlässigbar. Klarheit und Korrektheit Ihres Codes ist viel wichtiger.

+1

Sie kommentieren, welche Fälle 'False' auslösen wird, ist nicht wahr. 'bool' ist eine Unterklasse von' int'. Sie sind wie folgt definiert: 'True == 1' und' False == 0'. (Verwenden Sie in Ihrer Antwort leere Sammlungen ('[], {},()') anstelle von 'False'. – Dunes

+0

@Dunes Das ist ein guter Punkt. Danke, dass du es mir gezeigt hast! – Ben

Verwandte Themen