Nach meinem Verständnis generiert die range()
Funktion, die in Python 3 eigentlich ein Objekttyp ist , ihren Inhalt im laufenden Betrieb, ähnlich wie ein Generator.
In diesem Fall hätte ich erwartet, dass die folgende Zeile übermäßig viel Zeit in Anspruch nimmt, da zur Bestimmung, ob 1 Billiarde im Bereich liegt, Billiardenwerte generiert werden müssten:
1000000000000000 in range(1000000000000001)
Außerdem: Es scheint, dass die Berechnung unabhängig von der Anzahl der hinzugefügten Nullen mehr oder weniger dieselbe Zeit in Anspruch nimmt (im Grunde genommen augenblicklich).
Ich habe auch solche Dinge ausprobiert, aber die Berechnung ist immer noch fast augenblicklich:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
Wenn ich versuche, meine eigene Bereichsfunktion zu implementieren, ist das Ergebnis nicht so schön !!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
Was macht das range()
Objekt unter der Haube, das es so schnell macht?
Die Antwort von Martijn Pieters wurde aufgrund ihrer Vollständigkeit ausgewählt. In der ersten Antwort von abarnert finden Sie jedoch eine gute Diskussion darüber, was es bedeutet range
, eine vollwertige Sequenz in Python 3 zu sein, sowie einige Informationen / Warnungen zu möglichen Inkonsistenzen bei der __contains__
Funktionsoptimierung in Python-Implementierungen . Die andere Antwort von abarnert geht etwas detaillierter und enthält Links für diejenigen, die sich für die Geschichte der Optimierung in Python 3 (und die mangelnde Optimierung von xrange
Python 2) interessieren . Antworten von poke und von wim liefern den relevanten C-Quellcode und Erklärungen für diejenigen, die interessiert sind.
range
das ein Generator ist?
xrange
die gleiche wie Python3range
?
xrange()
Objekte haben keine __contains__
Methode, daher muss die Artikelprüfung alle Artikel durchlaufen. Außerdem gibt es einige andere Veränderungen range()
, wie es Slicing unterstützt (was wiederum ein zurückes range
Objekt) und hat nun auch count
und index
Methoden , um es mit kompatibel zu machen collections.Sequence
ABC.
bool
oder einlong
Typ ist. Bei anderen Objekttypen wird es verrückt. Versuchen Sie mit:100000000000000.0 in range(1000000000000001)