et
==`==
est jugé par "s'il s'agit de la même valeur", tandis que ʻis` est jugé par "s'il s'agit du même objet".
Par exemple, dans l'exemple suivant
>>> a = "hello"
>>> b = "hello"
Les deux objets ont la même valeur, donc par rapport à ==
, il renvoie True
.
>>> a == b
True
Cependant, ʻisest jugé par "est-ce le même objet?" En Python, lorsque vous créez un objet, il reçoit un numéro unique. «Est» est identifié par son numéro. Vous pouvez vérifier le numéro avec ʻid ()
.
>>> id(a)
2827074142256
>>> id(b)
2827074145520
>>> a is b
False
ʻIs instance` est une fonction qui compare les classes d'objets. Renvoie «True» par rapport à la classe parent si elle est héritée d'une autre classe
>>> class customint(int):
... pass
...
>>> c = customint()
>>> type(c) == int
False
>>> type(c) is int
False
>>> isinstance(c, int)
True
Exécutez chaque fonction 10 000 000 fois (10 millions de fois) et mesurez le temps d'exécution Répétez cette opération 10 fois pour calculer la moyenne Pour référence, j'exécute également une fonction qui boucle 10000000 fois sans rien faire
#!/usr/bin/env python3
# coding: utf-8
from time import time
intvar = 0
n = 10 ** 7
def gettime(name, num=10):
"""
Exécutez 10 fois, mesurez le temps d'exécution et calculez la moyenne
"""
def func(fn):
def wrapper(*args, **kwargs):
strat_t = time()
for a in range(num):
fn(*args, **kwargs)
dur = (time() - strat_t) / 10
print(name, "\t:", dur)
return wrapper
return func
@gettime("simple\t")
def simple():
for x in range(n):
pass
@gettime("equal\t")
def equal():
for x in range(n):
res = type(intvar) == int
if type(intvar) == True:
pass
@gettime("is\t")
def iscompare():
for x in range(n):
res = type(intvar) is int
@gettime("isinstance")
def isinstancecompare():
for x in range(n):
res = isinstance(intvar, int)
if __name__ == '__main__':
simple()
equal()
iscompare()
isinstancecompare()
(Unité: secondes)
Environnement d'exécution | Windows 10 Intel Core i7-8550U @ 1.80GHz RAM:16GB |
VPS de Sakura(v3) 1G |
---|---|---|
Boucle vide | 0.1508335590362549 | 0.37562224864959715 |
== |
0.8364578723907471 | 1.9130330801010131 |
is |
0.8253042459487915 | 1.799116063117981 |
isinstance |
0.5259079456329345 | 1.3679522275924683 |
Le temps d'exécution est
==
> is
>>> isinstance
C'est devenu un sentiment.
Alors
--Je veux faire une comparaison de type en tenant compte de l'héritage ――Je ne suis pas sûr de l'héritage, mais je veux juste trouver de la vitesse
En cas d '«instance»,
--Je veux ignorer l'héritage et effectuer une comparaison de type
Dans ce cas, utilisez ʻis`.
J'ai utilisé le décorateur pour la première fois, mais c'est vraiment pratique
Recommended Posts