sys.intern ()
gibt die "gleiche" Zeichenfolge in der Ausführungsumgebung für die "äquivalente" Zeichenfolge mit demselben Inhalt zurück. Die zurückgegebenen Zeichenfolgen stimmen jetzt mit "is" anstelle von "==" überein.
Mit sys.intern () sollten Sie mit erheblichen Beschleunigungen rechnen können, insbesondere wenn die Zeichenfolge lang ist. Ein Beispiel ist unten gezeigt.
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')
Ein Beispiel für die Ausführung in Python 3.6.2 wird gezeigt.
$ 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
Es ist ersichtlich, dass "comp2 (ia, ib)" schneller ist als "comp1 (a, b)". Außerdem scheint ==
erwartungsgemäß um O (n) langsamer zu sein als die Größe, während is
O (1) ist.
Übrigens ist das Ergebnis von "comp1 (ia, ib)" ("ia == ib") ebenfalls schnell genug, aber es ist ungefähr 10 ms weniger als "comp2 (ia, ib)" ("ia ist ib"). langsam. Ist es ein Wenn-Zweig oder so?
Nachtrag (01.09.2017): Der Inhalt wurde mit Python 3.6.2 korrigiert. Nachtrag (04.09.2017): Der Text wurde ein wenig korrigiert.
Recommended Posts