Was ist der Unterschied zwischen diesen beiden Codezeilen:
if not x == 'val':
und
if x != 'val':
Ist einer effizienter als der andere?
Wäre es besser zu benutzen
if x == 'val':
pass
else:
python
if-statement
equality
Lafferc
quelle
quelle
Antworten:
Verwenden Sie
dis
, um den für die beiden Versionen generierten Bytecode anzuzeigen:not ==
!=
Letzteres hat weniger Operationen und ist daher wahrscheinlich etwas effizienter.
Es wurde darauf hingewiesen , in den commments (danke, @Quincunx ) , dass , wo man
if foo != bar
gegenif not foo == bar
die Anzahl der Operationen ist genau das gleiche, es ist nur , dass dieCOMPARE_OP
Änderungen undPOP_JUMP_IF_TRUE
schaltet aufPOP_JUMP_IF_FALSE
:not ==
::!=
In diesem Fall ist es unwahrscheinlich, dass Sie überhaupt einen Leistungsunterschied feststellen, es sei denn, es gab einen Unterschied im Arbeitsaufwand für jeden Vergleich.
Beachten Sie jedoch, dass die beiden Versionen nicht immer logisch identisch sind , da dies von den Implementierungen
__eq__
und__ne__
für die betreffenden Objekte abhängt . Gemäß der Datenmodelldokumentation :Beispielsweise:
Schließlich, und vielleicht am wichtigsten ist : in der Regel, wo die beiden sind logisch identisch,
x != y
ist viel besser lesbar alsnot x == y
.quelle
__eq__
nicht mit übereinstimmt__ne__
, pleite.not x == y
eine weitere Anweisung vorhanden ist. Als ich den Code in eine einfügteif
, stellte sich heraus, dass beide die gleiche Anzahl von Anweisungen haben, nur einePOP_JUMP_IF_TRUE
und die anderePOP_JUMP_IF_FALSE
(das war der einzige Unterschied zwischen ihnen, abgesehen von der Verwendung einer anderenCOMPARE_OP
). Als ich den Code ohne dasif
s kompiliert habe , habe ich bekommen, was Sie haben.==
und schließen!=
sich nicht aus ist eine SQL-ähnliche Umsetzung beteiligtnull
Werte. In SQLnull
kehrt nichttrue
zu im!=
Vergleich zu jedem anderen Wert, so Python - Implementierungen von SQL - Schnittstellen auch das gleiche Problem haben.not ==
und hingewiesen!=
, es scheint der interessanteste Teil meiner Antwort zu sein! Ich denke nicht, dass dies der Ort ist, an dem man darüber nachdenken kann, ob, warum und wann dies sinnvoll ist - siehe z Warum hat Python eine__ne__
Operatormethode anstelle von nur__eq__
?@jonrsharpe hat eine ausgezeichnete Erklärung, was los ist. Ich dachte, ich würde nur den Zeitunterschied zeigen, wenn ich jede der 3 Optionen 10.000.000 Mal ausführe (genug, um einen kleinen Unterschied zu zeigen).
Verwendeter Code:
Und der cProfile-Profiler ergibt:
Wir können also sehen, dass zwischen
if not x == 'val':
und ein sehr kleiner Unterschied von ~ 0,7% bestehtif x != 'val':
. Von diesenif x != 'val':
ist die schnellste.Am überraschendsten ist jedoch, dass wir das sehen können
ist in der Tat die schnellste und schlägt
if x != 'val':
um ~ 0,3%. Dies ist nicht sehr gut lesbar, aber ich denke, wenn Sie eine vernachlässigbare Leistungsverbesserung wünschen, könnte man diesen Weg gehen.quelle
In der ersten muss Python eine Operation mehr ausführen als nötig (anstatt nur zu prüfen, ob sie nicht gleich ist, muss geprüft werden, ob sie nicht wahr ist, also eine weitere Operation). Es wäre unmöglich, den Unterschied zu einer Ausführung zu erkennen, aber wenn sie mehrmals ausgeführt würde, wäre die zweite effizienter. Insgesamt würde ich die zweite verwenden, aber mathematisch sind sie gleich
quelle
Hier können Sie sehen, dass
not x == y
eine Anweisung mehr als hatx != y
. Daher ist der Leistungsunterschied in den meisten Fällen sehr gering, es sei denn, Sie führen Millionen von Vergleichen durch, und selbst dann ist dies wahrscheinlich nicht die Ursache für einen Engpass.quelle
Ein zusätzlicher Hinweis, da die anderen Antworten Ihre Frage größtenteils richtig beantwortet haben, ist, dass wenn eine Klasse nur definiert
__eq__()
und nicht definiert__ne__()
, SieCOMPARE_OP (!=)
sie ausführen__eq__()
und negieren. Zu diesem Zeitpunkt ist Ihre dritte Option wahrscheinlich ein kleines bisschen effizienter, sollte aber nur in Betracht gezogen werden, wenn Sie die Geschwindigkeit benötigen, da es schwierig ist, sie schnell zu verstehen.quelle
Es geht um deine Art, es zu lesen.
not
Der Operator ist dynamisch, deshalb können Sie ihn in anwendenKönnte
!=
aber in einem besseren Kontext als Operator gelesen werden, der das Gegenteil von dem==
tut, was er tut.quelle
not
Operator ist dynamisch" ?Ich möchte meinen obigen Lesbarkeitskommentar erweitern.
Auch hier stimme ich der Lesbarkeit voll und ganz zu, die andere (leistungsschwache) Bedenken außer Kraft setzt.
Ich möchte darauf hinweisen, dass das Gehirn "positiv" schneller interpretiert als "negativ". ZB "Stop" vs. "Nicht gehen" (ein ziemlich mieses Beispiel aufgrund der unterschiedlichen Anzahl von Wörtern).
Also eine Wahl gegeben:
ist dem funktional äquivalenten vorzuziehen:
Weniger Lesbarkeit / Verständlichkeit führt zu mehr Fehlern. Vielleicht nicht in der Erstcodierung, aber die (nicht so kluge wie Sie!) Wartungsänderungen ...
quelle