Les opérateurs “is” et “==” en python
- 2021-03-01
- Publié par : Christophe DELEUZE
- Catégorie : Python
Il est très important que chaque développeur qui utilise le langage de programmation Python comprenne la différence entre l’opérateur d’égalité == et l’opérateur d’identité is avant de les utiliser.
L’opérateur is peut sembler identique à == mais ce ne sont pas les mêmes.
Différence entre is et ==
is est un opérateur d’identité utilisé pour vérifier si deux variables pointent vers le même objet en mémoire ou pour comparer l’identité de deux objets. Il renvoie True si les opérandes sont identiques (se réfèrent au même objet).
Voyons avec un exemple :
>>> variable_1 = 500
>>> variable_2 = 500
>>> variable_1 is variable_2
False
Le code ci-dessus a renvoyé False car les deux variables sont deux objets différents, c’est-à-dire stockées dans des adresses de mémoire différentes ( 0x7fce1afef330 & 0x7fce1afef050).
Pour obtenir les adresses mémoire de variable_1 et variable_2, utilisez hex(id(variable_1)) et hex(id(variable_2)).
En revanche, l’opérateur == vérifie si les valeurs des deux variables sont identiques. Il renvoie True si les deux opérandes sont égaux.
>>> variable_1 = 500
>>> variable_2 = 500
>>> variable_1 == variable_2
True
Comme prévu, le code ci-dessus a renvoyé True car le contenu des deux variables est égal.
Cas d'usage
En règle générale, il faut utiliser l’opérateur == lorsque votre objectif principal est de comparer le contenu / les valeurs de deux objets et que vous ne vous souciez pas de l’endroit où ils sont stockés en mémoire. N’utilisez l’opérateur is que lorsque vous souhaitez vérifier si deux variables pointent vers la même adresse mémoire.
Lorsque vous effectuez une opération de comparaison de chaînes avec l’opérateur ==, python compare caractère par caractère.
>>> 'Abc' == 'Abc'
True
La chaîne 'Abc' utilisée dans l’exemple ci-dessus est très petite. Mais que faire si nous avons une chaîne très longue ? Python compare toujours caractère par caractère. Or, c’est un processus qui peut être très lent. Au lieu de comparer le contenu, nous pouvons simplement comparer leurs adresses mémoire qui ne sont que des entiers. Comme comparer des entiers est bien plus rapide que de comparer deux longues chaînes caractère par caractère c’est une approche très intéressant pour gagner en rapidité, utiliser moins de ressources de la part de notre processeur .
REMARQUE : Python pointe les variables vers la même adresse mémoire lorsqu’elles contiennent le même contenu. Toutes les chaînes ne sont pas automatiquement mises en mémoire (internée) en python. Mais, nous pouvons forcer les chaînes à être internées en utilisant sys.intern().
Donc, utilisez l’opérateur is (identité) plutôt que l’opérateur == (égalité) pour accélérer vos opérations de comparaison de chaînes lourdes.
Test de performance
Pour ce qui du choix de l’opérateur, il faut s’adapter en fonction du contexte, mais en termes de vitesse, is (identité) sera toujours plus rapide que == (égalité).
Vérifions-le avec un code qui va évaluer la performance entre les deux opérateurs.
Le temps d’exécution de l’opérateur == :
import time
def operateur_egalite(n):
a = 'Lequel est le meilleur? identité ou egalité ?' * 1000
b = 'Lequel est le meilleur? identité ou egalité ?' * 1000
for i in range(n):
if a == b :
pass
debut = time.perf_counter()
operateur_egalite(10000000)
fin = time.perf_counter()
print('Temps total : ',debut — fin)
Temps total : 14.075116038999113
Le temps d’exécution de l’opérateur is :
import sys
def operateur_identite(n):
a = sys.intern('Lequel est le meilleur? identité ou egalité ?' * 1000)
b = sys.intern('Lequel est le meilleur? identité ou egalité ?' * 1000)
for i in range(n):
if a is b :
pass
debut = time.perf_counter()
identity_operator(10000000)
fin = time.perf_counter()
print('Temps total : ',debut — fin)
Temps total : 0.3351166579996061
Les résultats ci-dessus sont sans appel et montrent que l’ opérateur is bat == en termes de temps d’exécution sur des chaines de taille très longue.
Le mot de la fin
Maintenant, vous connaissez tous les secrets de is & ==. Il ne te reste plus qu’à faire le bon choix au moment où tu en auras besoin.
Et si tu as des questions, envie que j’écrive sur un sujet en particulier, les commentaires et la page de contact sont là pour ça.