sys.intern ()
renvoie la "même" chaîne de caractères dans l'environnement d'exécution pour la chaîne de caractères "équivalente" avec le même contenu. Les chaînes renvoyées correspondent désormais à ʻis au lieu de
== `.
Vous devriez pouvoir vous attendre à des accélérations significatives avec sys.intern ()
, surtout si la chaîne est longue. Un exemple est présenté ci-dessous.
intern_test.py
import sys
import timeit
def comp1(a, b):
return a == b
def comp2(a, b):
return a is b
for n in [10000, 50000]:
a = ''.join([str(s) for s in range(0, n)])
b = ''.join([str(s) for s in range(0, n)])
ia = sys.intern(a)
ib = sys.intern(b)
print("--{}--".format(n))
print("comp1(a, b)", comp1(a, b),
timeit.timeit("comp1(a, b)", globals=globals()), sep='\t')
print("comp2(a, b)", comp2(a, b),
timeit.timeit("comp2(a, b)", globals=globals()), sep='\t')
print("comp1(ia, ib)", comp1(ia, ib),
timeit.timeit("comp1(ia, ib)", globals=globals()), sep='\t')
print("comp2(ia, ib)", comp2(ia, ib),
timeit.timeit("comp2(ia, ib)", globals=globals()), sep='\t')
Un exemple d'exécution en Python 3.6.2 est présenté.
$ python intern_test.py
--10000--
comp1(a, b) True 1.5900884549773764
comp2(a, b) False 0.12032010598341003
comp1(ia, ib) True 0.13831643099547364
comp2(ia, ib) True 0.13083625899162143
--50000--
comp1(a, b) True 11.056225399981486
comp2(a, b) False 0.11997383600100875
comp1(ia, ib) True 0.13671555201290175
comp2(ia, ib) True 0.12875197199173272
On peut voir que «comp2 (ia, ib)» est plus rapide que «comp1 (a, b)». De plus, ==
semble être plus lent de O (n) que la taille attendue, tandis que ʻis` est O (1).
Au fait, le résultat de comp1 (ia, ib)
(ʻia == ib) est également assez rapide, mais il est inférieur à 10ms par rapport à
comp2 (ia, ib) (ʻia is ib
). lent. Est-ce une branche if ou quelque chose?
Addendum (2017-09-01): Correction du contenu à l'aide de Python 3.6.2. Addendum (2017-09-04): Corrige un peu le texte.
Recommended Posts