Heim > Backend-Entwicklung > Python-Tutorial > Warum ist 1000000000000000 im Bereich (1000000000000001) in Python3 so schnell?

Warum ist 1000000000000000 im Bereich (1000000000000001) in Python3 so schnell?

anonymity
Freigeben: 2019-05-27 11:21:29
Original
2987 Leute haben es durchsucht

Wie schnell kann der Ausdruck 1000000000000000 in range(1000000000000001) in Python ausgeführt werden?

Warum ist 1000000000000000 im Bereich (1000000000000001) in Python3 so schnell?

Der einfachste und gröbste Weg, um zu bestimmen, ob ein Element x „true“ zurückgibt, ist seine zeitliche Komplexität O(n), die theoretische zeitliche Komplexität der Verwendung des Hash-Algorithmus ist O( 1) und die Zeitkomplexität der binären Suche beträgt O(log n), welchen Algorithmus verwendet Python dann, um dies zu erreichen?

Lassen Sie uns zuerst ein Experiment durchführen:

#python2
timeit.timeit('1000000000 in range(0,1000000000,10)', number=1)
5.50357640805305
timeit.timeit('1000000000 in xrange(0,1000000000,10)', number=1)
2.3025200839183526
# python3
import timeit
timeit.timeit('1000000000 in range(0,1000000000,10)', number=1)
4.490355838248402e-06
Nach dem Login kopieren

Wir alle wissen, dass die Range-Funktion in Python2 ein Listenobjekt zurückgibt, das alle Elemente auf einmal in den Speicher lädt, also führen Sie den ersten Ausdruck aus Das System fühlt sich plötzlich sehr festgefahren an und es dauert mehr als 5 Sekunden.

xrange ähnelt der Range-Funktion in Python3, beide geben ein Iteratorobjekt zurück, aber ihre Ausführungsergebnisse sind so unterschiedlich, dass es überraschend ist. Der dritte Ausdruck dauert fast 0 Sekunden. Warum gibt es einen so großen Unterschied zwischen xrange in Python2 und der Range-Funktion in Python3? Um das Geheimnis zu verstehen, müssen wir verstehen, wie die Operation durchgeführt wird. Gemäß den Regeln von in in der Python-Dokumentation:

Wenn die Klasse die Methode contains() implementiert, gibt x in y auch true zurück, solange y.contains(x) true zurückgibt, und umgekehrt .

Die Methode „contains()“ ist nicht implementiert, aber die Methode „iter()“ ist implementiert. Wenn während des Iterationsprozesses ein bestimmter Wert z==x vorhanden ist, wird „true“ zurückgegeben, andernfalls ist dies der Fall FALSCH.

Wenn keine der beiden oben genannten Methoden implementiert ist, schauen Sie sich die Methode getitem() an. Wenn es einen Index i mit x==y[i] gibt, geben Sie true zurück, andernfalls geben Sie false zurück.

Nachdem wir die Regeln von in verstanden haben, werfen wir zunächst einen Blick auf die von xrange bereitgestellten Methoden:

dir(xrange)
['__class__','__getitem__', '__hash__', '__init__', 
'__iter__', '__len__', '__new__', ...]
Nach dem Login kopieren

Ja, die xrange-Funktion implementiert nur getitem und iter, um zu bestimmen, ob x in y benötigt wird Der Vergleich wird iterativ Wert für Wert durchgeführt, was bedeutet, dass die zeitliche Komplexität von xrange O(n) beträgt.

Werfen wir einen Blick auf die Range-Methoden von Python3:

 dir(range)
['__class__', '__contains__', '__getitem__', '__iter__',  
'count', 'index', 'start', 'step', 'stop', ...]
Nach dem Login kopieren

range bietet viel mehr Attribute als xrange. Es implementiert nicht nur getitem und iter, sondern auch contains, also wird es aufgerufen Enthält zunächst die Methode und stellt außerdem drei Attribute bereit: Start, Stopp und Schritt. Warum genau wird es so schnell ausgeführt? Werfen wir einen Blick darauf, wie die Methode „contains“ implementiert wird.

Contains vergleicht in Python3 die Werte nicht iterativ einzeln, sondern verwendet eine solche Logik:

Überprüfen Sie zunächst, ob x zwischen dem Start- und Stoppbereich liegt : start <= x < stop

Wenn es innerhalb dieses Intervalls liegt, berechnen Sie gemäß Schritt, ob x zufällig auf einen bestimmten Wert im xrange-Intervall fällt. Hier verwenden wir die Modulo-Methode, um Folgendes zu bestimmen: (x - Start) % Schritt == 0

Die Wahrheit wird in diesem Moment enthüllt, die zeitliche Komplexität von xrange ist O(1), das heißt, egal wie groß der Stoppwert in xrange( Start, Stopp, Schritt) ist die Zeitkomplexität. Es ist alles eine Konstante. Daher kann die Range-Methode in Python3 nicht nur Speicher sparen, sondern auch effizienter arbeiten. Machen Sie sich also keine Gedanken darüber, ob Sie Python2 oder Python3 lernen möchten.

Das obige ist der detaillierte Inhalt vonWarum ist 1000000000000000 im Bereich (1000000000000001) in Python3 so schnell?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage