Python si non == vs si !=
Quelle est la différence entre ces deux lignes de code:
if not x == 'val':
et
if x != 'val':
Est un plus efficace que l'autre?
Il serait mieux d'utiliser
if x == 'val':
pass
else:
- Le mieux est celui que vous pouvez lire, je doute de votre programme de goulot d'étranglement sera ici
- Cette question m'intéresse dans le "x n'est pas dans la liste" et "pas de x dans la liste des" cas
- ils sont interprétés de la même manière.
- référence à mon commentaire ci-dessus: stackoverflow.com/q/8738388/3001761
- votre lien est sur le sous-chaînes. J'ai pensé à des collections(liste/dict/set). De toute façon - sens, merci!
- c'est la même chose pour ceux qui, trop; c'est la façon dont la syntaxe est interprété, il n'a pas d'importance ce que les deux opérandes sont.
- Le
not x == 'val'
est un peu plus lent pour être analysé que lax != 'val'
, mais la différence de temps est au-delà de la mesure. Le réel le temps d'exécution est égal.
Vous devez vous connecter pour publier un commentaire.
À l'aide de
dis
de regarder le bytecode généré pour les deux versions:not ==
!=
Le dernier a moins d'opérations, et est donc susceptible d'être légèrement plus efficace.
Il a été souligné dans le commments (merci, @Quinconce) que si vous avez
if foo != bar
vsif not foo == bar
le nombre d'opérations est exactement la même chose, c'est juste que leCOMPARE_OP
changements etPOP_JUMP_IF_TRUE
commutateurs àPOP_JUMP_IF_FALSE
:not ==
:!=
Dans ce cas, sauf s'il y a une différence dans la quantité de travail nécessaire pour chaque comparaison, il est peu probable que vous verriez aucune différence de performances à tous.
Cependant, noter que les deux versions ne sera pas toujours logiquement identiques, car cela dépendra de la mise en œuvre de
__eq__
et__ne__
pour les objets en question. Par le modèle de données de la documentation:Par exemple:
Enfin, et peut-être le plus important: en général, où les deux sont logiquement identiques,
x != y
est beaucoup plus lisible quenot x == y
.__eq__
incompatible avec__ne__
est flat-out cassé.not x == y
a un plus d'instruction. Quand j'ai mis le code dans unif
, il s'est avéré qu'ils ont le même nombre d'instructions, un seul avaitPOP_JUMP_IF_TRUE
et les autresPOP_JUMP_IF_FALSE
(c'était la seule différence entre eux, autres que l'aide d'un autreCOMPARE_OP
). Lorsque j'ai compilé le code sans lesif
s, j'ai obtenu ce que vous avez obtenu.==
et!=
ne sont pas mutuellement exclusives est un type SQL de mise en œuvre impliquantnull
valeurs. Dans SQLnull
ne retourne pastrue
à!=
par rapport à toute autre valeur, de sorte python implémentations de SQL interfaces peuvent également avoir le même problème.not ==
et!=
, il semble être la partie la plus intéressante de ma réponse! Je ne pense pas que c'est le lieu de s'attarder sur si, pourquoi et quand cela a du sens (voir par exemple Pourquoi Python ont une__ne__
opérateur méthode au lieu de simplement__eq__
?@jonrsharpe a une excellente explication de ce qui se passe. Je pensais que je venais de montrer les différences de temps lors de l'exécution de chacune des 3 options 10 000 000 de fois (assez pour une légère différence à montrer).
Code utilisé:
Et la cProfile profiler résultats:
Ainsi, nous pouvons voir qu'il y a une très infime différence de ~de 0,7% entre
if not x == 'val':
etif x != 'val':
. De ces,if x != 'val':
est le plus rapide.Cependant, le plus surprenant, nous pouvons voir que
est en fait la manière la plus rapide et beats
if x != 'val':
par ~0.3%. Ce n'est pas très lisible, mais je suppose que si vous vouliez négligeable d'amélioration de la performance, on pourrait aller dans cette voie.Dans la première Python a l'exécution d'un plus grand nombre d'opérations que nécessaire(au lieu de vérifier simplement pas égale à elle a vérifier si il n'est pas vrai que c'est égal, donc encore une opération). Il serait impossible de faire la différence entre une exécution, mais si elle est exécutée plusieurs fois, la deuxième serait plus efficace. Globalement, je dirais utiliser la seconde, mais mathématiquement, ils sont de la même
Ici, vous pouvez voir que
not x == y
a un plus d'instruction quex != y
. Donc, la différence de performance sera très faible dans la plupart des cas, sauf si vous faites de millions de comparaisons et même alors, ce ne sera probablement pas être la cause d'un goulot d'étranglement.Une note supplémentaire, puisque les autres réponses répondu à votre question, la plupart du temps correctement, c'est que si une classe ne définit
__eq__()
et pas__ne__()
, alors votreCOMPARE_OP (!=)
sera exécuté__eq__()
et le nier. A l'époque, la troisième option est susceptible d'être un tout petit peu plus efficace, mais doit être considérée uniquement si vous avez BESOIN de la vitesse, car il est difficile de comprendre rapidement.Il est de votre façon de lire.
not
opérateur est dynamique, c'est pourquoi vous êtes en mesure de l'appliquer dansMais
!=
on pouvait lire dans un meilleur contexte comme un opérateur qui fait le contraire de ce que==
n'.not
opérateur est dynamique"?Je veux développer mon lisibilité commentaire ci-dessus.
Encore une fois, je suis entièrement d'accord avec la lisibilité annuler les autres (performance-négligeable) des préoccupations.
Ce que je voudrais souligner est que le cerveau interprète "positif" plus vite qu'il n'est "négatif". E. g., "stop" et de "ne pas aller" (plutôt moche exemple en raison de la différence en nombre de mots).
Donc, étant donné un choix:
est préférable à la fonctionnellement équivalent:
Moins de lisibilité/compréhension conduit à plus de bugs. Peut-être pas dans les premières de codage, mais l' (pas aussi intelligent que vous!) l'entretien des changements...