Anscheinend ist xrange schneller, aber ich habe keine Ahnung, warum es schneller ist (und kein Beweis außer dem Anekdoten, dass es schneller ist) oder was darüber hinaus anders ist
for i in range(0, 20):
for i in xrange(0, 20):
In Python 2.x:
range
Erstellt eine Liste. Wenn Sie dies tun range(1, 10000000)
, wird eine Liste mit 9999999
Elementen im Speicher erstellt .
xrange
ist ein Sequenzobjekt, das träge ausgewertet wird.
In Python 3 range
entspricht dies Python xrange
, und um die Liste zu erhalten, müssen Sie verwenden list(range(...))
.
xrange(x).__iter__()
ist ein Generator.i
bei Bedarf und nicht bei der Initialisierung ausgewertet wird.Dies ist wahr, wird aber in Python 3
.range()
von Python 2 implementiert.xrange()
. Wenn Sie die Liste tatsächlich generieren müssen, müssen Sie Folgendes tun:quelle
xrange
einen Generator anzurufen? Es ist eine Funktion, die eineyield
Anweisung enthält, und laut Glossar werden solche Funktionen Generatoren genannt.Denken Sie daran,
timeit
testen Sie mit dem Modul, welcher der kleinen Codeausschnitte schneller ist!Persönlich verwende ich immer
.range()
, es sei denn, ich habe es mit wirklich großen Listen zu tun - wie Sie zeitlich sehen können, beträgt der zusätzliche Aufwand für eine Liste mit einer Million Einträgen nur 0,04 Sekunden. Und wie Corey betont, wird Python 3.0.xrange()
verschwinden und.range()
Ihnen trotzdem ein gutes Iteratorverhalten geben.quelle
python -m timeit "for i in xrange(1000000):" " pass"
the extra overhead is only 0.04 seconds
Ist nicht die richtige Sichtweise,(90.5-51.1)/51.1 = 1.771 times slower
ist richtig, weil sie vermittelt, dass dies möglicherweise ein Engpass sein kann, wenn dies die Kernschleife Ihres Programms ist. Wenn dies jedoch ein kleiner Teil ist, ist 1,77x nicht viel.xrange
speichert nur die Bereichsparameter und generiert die Nummern bei Bedarf. Die C-Implementierung von Python beschränkt ihre Argumente derzeit jedoch auf C-Longs:Beachten Sie, dass es in Python 3.0 nur gibt
range
und es sich wie 2.x verhält,xrange
jedoch ohne die Einschränkungen für minimale und maximale Endpunkte.quelle
xrange gibt einen Iterator zurück und speichert jeweils nur eine Zahl. Der Bereich speichert die gesamte Liste der Zahlen.
quelle
xrange
gibt keinen Iterator zurück.and only keeps one number in memory at a time
und wo der Rest platziert ist,Verbringen Sie einige Zeit mit der Bibliotheksreferenz . Je vertrauter Sie damit sind, desto schneller finden Sie Antworten auf solche Fragen. Besonders wichtig sind die ersten Kapitel über eingebaute Objekte und Typen.
Eine andere Möglichkeit, schnelle Informationen zu einem Python-Konstrukt zu finden, ist die Dokumentzeichenfolge und die Hilfefunktion:
quelle
Ich bin schockiert, dass niemand doc gelesen hat :
quelle
Dies bringt Ihnen zwei Vorteile:
MemoryError
.quelle
In diesem einfachen Beispiel finden Sie den Vorteil von
xrange
overrange
:Das obige Beispiel spiegelt im Fall von nichts wesentlich Besseres wider
xrange
.Schauen Sie sich nun den folgenden Fall an
range
, in dem es im Vergleich zu wirklich sehr, sehr langsam istxrange
.Mit erstellt
range
es bereits eine Liste von 0 bis 100000000 (zeitaufwändig),xrange
ist jedoch ein Generator und generiert nur Zahlen basierend auf dem Bedarf, dh wenn die Iteration fortgesetzt wird.In Python-3 ist die Implementierung der
range
Funktionalität dieselbe wiexrange
in Python-2, während siexrange
in Python-3 abgeschafft wurdeViel Spaß beim Codieren !!
quelle
Es ist aus Optimierungsgründen.
range () erstellt eine Liste von Werten von Anfang bis Ende (0 .. 20 in Ihrem Beispiel). Dies wird in sehr großen Bereichen zu einer teuren Operation.
xrange () ist dagegen viel optimierter. Der nächste Wert wird nur bei Bedarf berechnet (über ein xrange-Sequenzobjekt) und es wird keine Liste aller Werte erstellt, wie dies bei range () der Fall ist.
quelle
range(x,y)
Gibt eine Liste jeder Zahl zwischen x und y zurück, wenn Sie einefor
Schleife verwenden, undrange
ist dann langsamer. In der Tatrange
hat einen größeren Indexbereich.range(x.y)
druckt eine Liste aller Zahlen zwischen x und y ausxrange(x,y)
Gibt zurück,xrange(x,y)
aber wenn Sie einefor
Schleife verwendet haben,xrange
ist dies schneller.xrange
hat einen kleineren Indexbereich.xrange
druckt nicht nur aus,xrange(x,y)
sondern behält auch alle darin enthaltenen Nummern bei.Wenn Sie eine
for
Schleife verwenden, würde es funktionierenEs gibt keinen großen Unterschied bei der Verwendung von Loops, obwohl es einen Unterschied beim Drucken gibt!
quelle
range (): range (1, 10) gibt eine Liste mit 1 bis 10 Zahlen zurück und speichert die gesamte Liste.
xrange (): Wie range (), aber anstatt eine Liste zurückzugeben, wird bei Bedarf ein Objekt zurückgegeben, das die Zahlen im Bereich generiert. Für Schleifen ist dies etwas schneller als range () und speichereffizienter. xrange () Objekt wie ein Iterator und generiert die Zahlen bei Bedarf. (Lazy Evaluation)
quelle
Einige der anderen Antworten erwähnt , dass Python 3 2.x ist eliminiert
range
und umbenannt 2.x istxrange
zurange
. Wenn Sie jedoch nicht 3.0 oder 3.1 verwenden (was niemand sein sollte), handelt es sich tatsächlich um einen etwas anderen Typ.Wie die 3.1-Dokumente sagen:
In Version 3.2+
range
handelt es sich jedoch um eine vollständige Sequenz - sie unterstützt erweiterte Slices und alle Methodencollections.abc.Sequence
mit derselben Semantik wie alist
. * *Und zumindest in CPython und PyPy (die einzigen zwei 3.2+ Implementierungen , die derzeit vorhanden ist ), hat es auch konstante Zeit Implementierungen der
index
undcount
Methoden und diein
Betreiber (solange man es nur ganze Zahlen passieren). Dies bedeutet, dass das Schreiben123456 in r
in 3.2+ vernünftig ist, während es in 2.7 oder 3.1 eine schreckliche Idee wäre.* Die Tatsache , dass
issubclass(xrange, collections.Sequence)
ErträgeTrue
in 2,6-2,7 und 3,0-3,1 ist ein Fehler , der in 3.2 und nicht zurückportiert wurde behoben.quelle
In Python 2.x.
range (x) gibt eine Liste zurück, die mit x Elementen im Speicher erstellt wird.
xrange (x) gibt ein xrange-Objekt zurück, das ein Generatorobjekt ist, das die Zahlen bei Bedarf generiert. Sie werden während der for-Schleife (Lazy Evaluation) berechnet.
Für Schleifen ist dies etwas schneller als range () und speichereffizienter.
quelle
xrange()
ist kein Generator.xrange(n)
.__ iter __ () `ist.Beim Testen des Bereichs gegen xrange in einer Schleife (ich weiß, ich sollte timeit verwenden , aber dies wurde mithilfe eines einfachen Beispiels zum Listenverständnis schnell aus dem Speicher gehackt) fand ich Folgendes:
was gibt:
Oder verwenden Sie xrange in der for-Schleife:
Wird mein Snippet richtig getestet? Irgendwelche Kommentare zur langsameren Instanz von xrange? Oder ein besseres Beispiel :-)
quelle
xrange
schien etwas schneller zu sein, obwohl der Vergleich mit Python 3 jetzt überflüssig ist.timeit
. Es kümmert sich darum, viele Male zu laufen, GC zu deaktivieren, die beste Uhr anstelle vontime
usw. zu verwendenxrange () und range () in Python funktionieren ähnlich wie für den Benutzer, aber der Unterschied ergibt sich, wenn wir darüber sprechen, wie der Speicher bei Verwendung beider Funktionen zugewiesen wird.
Wenn wir range () verwenden, weisen wir allen von ihm generierten Variablen Speicher zu. Daher wird die Verwendung mit der größeren Zahl nicht empfohlen. von zu generierenden Variablen.
xrange () hingegen generiert jeweils nur einen bestimmten Wert und kann nur mit der for-Schleife verwendet werden, um alle erforderlichen Werte zu drucken.
quelle
range generiert die gesamte Liste und gibt sie zurück. xrange nicht - es generiert bei Bedarf die Nummern in der Liste.
quelle
xrange verwendet einen Iterator (generiert Werte im laufenden Betrieb), range gibt eine Liste zurück.
quelle
Was?
range
Gibt zur Laufzeit eine statische Liste zurück.xrange
Gibt einobject
(das sich wie ein Generator verhält, obwohl es sicherlich keines ist) zurück, aus dem bei Bedarf Werte generiert werden.Wann welche verwenden?
xrange
Sie diese Option, wenn Sie eine Liste für einen gigantischen Bereich erstellen möchten, z. B. 1 Milliarde, insbesondere wenn Sie ein "speicherempfindliches System" wie ein Mobiltelefon haben.range
Sie diese Option, wenn Sie die Liste mehrmals durchlaufen möchten.PS: Python 3.x die
range
Funktion == Python 2.x -xrange
Funktion.quelle
xrange
gibt kein Generatorobjekt zurück.Jeder hat es sehr erklärt. Aber ich wollte, dass es es selbst sieht. Ich benutze Python3. Also öffnete ich den Ressourcenmonitor (unter Windows!) Und führte zuerst den folgenden Befehl aus:
und überprüfte dann die Änderung im 'In Use'-Speicher. Es war unbedeutend. Dann habe ich den folgenden Code ausgeführt:
Und es brauchte sofort einen großen Teil des Speichers, um verwendet zu werden. Und ich war überzeugt. Sie können es selbst versuchen.
Wenn Sie Python 2X verwenden, ersetzen Sie 'range ()' im ersten Code durch 'xrange ()' und 'list (range ())' durch 'range ()'.
quelle
Aus den Hilfedokumenten.
Python 2.7.12
Python 3.5.2
Der Unterschied ist offensichtlich. Gibt in Python 2.x
range
eine Liste undxrange
ein iterierbares xrange-Objekt zurück.Wird in Python 3.x
range
zuxrange
Python 2.x undxrange
wird entfernt.quelle
Bei einer Anforderung zum Scannen / Drucken von 0-N-Elementen funktionieren Bereich und x-Bereich wie folgt.
range () - Erstellt eine neue Liste im Speicher und nimmt die gesamten 0 bis N Elemente (insgesamt N + 1) und druckt sie aus. xrange () - Erstellt eine Iteratorinstanz, die die Elemente durchsucht und nur das aktuell angetroffene Element im Speicher behält, wodurch immer die gleiche Speichermenge verwendet wird.
Wenn sich das erforderliche Element nur etwas am Anfang der Liste befindet, spart dies viel Zeit und Speicher.
quelle
xrange
erstellt keine Iteratorinstanz. Es wird einxrange
Objekt erstellt, das iterierbar ist, aber kein Iterator - fast (aber nicht ganz) eine Sequenz wie eine Liste.Range gibt eine Liste zurück, während xrange ein xrange- Objekt zurückgibt , das unabhängig von der Bereichsgröße denselben Speicher belegt. In diesem Fall wird nur ein Element pro Iteration generiert und ist verfügbar, während bei Verwendung von range alle Elemente gleichzeitig und generiert werden sind im Speicher verfügbar.
quelle
Der Unterschied verringert sich für kleinere Argumente zu
range(..)
/xrange(..)
:In diesem Fall
xrange(100)
ist nur etwa 20% effizienter.quelle
range: -range füllt alles auf einmal. Dies bedeutet, dass jede Nummer des Bereichs den Speicher belegt.
xrange: -xrange ist so etwas wie ein Generator. Es wird angezeigt, wenn Sie den Zahlenbereich möchten, aber nicht möchten, dass sie gespeichert werden, wie wenn Sie in for loop.so speichereffizient verwenden möchten.
quelle
Darüber hinaus ist if do
list(xrange(...))
gleichbedeutend mitrange(...)
.Ist
list
also langsam.xrange
Beendet die Sequenz auch wirklich nicht vollständigDeshalb ist es keine Liste, sondern ein
xrange
Objektquelle
range()
in Python2.x
Diese Funktion ist im Wesentlichen die alte
range()
Funktion, die in Python verfügbar war,2.x
und gibt eine Instanz eineslist
Objekts zurück, das die Elemente im angegebenen Bereich enthält.Diese Implementierung ist jedoch zu ineffizient, wenn eine Liste mit einem Zahlenbereich initialisiert werden soll. Zum Beispiel
for i in range(1000000)
wäre die Ausführung eines Befehls sehr teuer, sowohl in Bezug auf den Speicher als auch in Bezug auf die Zeitnutzung, da die Speicherung dieser Liste im Speicher erforderlich ist.range()
in Python3.x
undxrange()
in Python2.x
Python
3.x
führte eine neuere Implementierung von einrange()
(während die neuere Implementierung bereits in Python2.x
über diexrange()
Funktion verfügbar war ).Das
range()
nutzt eine Strategie, die als Lazy Evaluation bekannt ist. Anstatt eine große Liste von Elementen im Bereich zu erstellen, führt die neuere Implementierung die Klasse einrange
, ein leichtes Objekt, das die erforderlichen Elemente im angegebenen Bereich darstellt, ohne sie explizit im Speicher zu speichern (dies mag nach Generatoren klingen, aber das Konzept der verzögerten Auswertung ist es anders).Betrachten Sie als Beispiel Folgendes:
und
quelle
In diesem Beitrag finden Sie den Unterschied zwischen Bereich und Bereich:
Zitieren:
quelle
xrange
ist kein Iterator. Die von zurückgegebene Listerange
unterstützt die Iteration (eine Liste ist so ziemlich das prototypische Beispiel einer iterierbaren Liste). Der Gesamtnutzen vonxrange
ist nicht "minimal". Und so weiter.