Was ist der Unterschied zwischen Range- und Xrange-Funktionen in Python 2.X?

Lesezeit: 6 Minuten

Benutzer-Avatar
Teifion

Anscheinend ist xrange schneller, aber ich habe keine Ahnung, warum es schneller ist (und abgesehen von den bisherigen Anekdoten keinen Beweis dafür, dass es schneller ist) oder was darüber hinaus anders ist

for i in range(0, 20):
for i in xrange(0, 20):

Benutzer-Avatar
Karl

In Python 2.x:

  • range erstellt eine Liste, also wenn Sie dies tun range(1, 10000000) es erstellt eine Liste im Speicher mit 9999999 Elemente.

  • xrange ist ein Sequenzobjekt, das träge auswertet.

In Python3:

  • range macht das Äquivalent von Python 2 xrange. Um die Liste zu erhalten, müssen Sie explizit verwenden list(range(...)).
  • xrange existiert nicht mehr.

  • Warum haben sie xrange gemacht, anstatt range faul zu machen?

    – Rob Grant

    27. August 2014 um 8:10 Uhr

  • @RobertGrant Wenn Sie diese Liste 1000 Mal durchlaufen, ist es langsamer, die Werte jedes Mal zu generieren

    – Alvaro

    27. Februar 2015 um 13:33 Uhr

  • @RobertGrant, das haben sie. In Python 3. (Das war in der Python 2.x-Reihe nicht möglich, da alle Änderungen abwärtskompatibel sein müssen.)

    – Paul Tucher

    7. Mai 2015 um 3:50 Uhr

  • Kann jemand erklären, was “faul auswerten” bedeutet? Vielen Dank!

    – Ratulotron

    23. August 2015 um 14:27 Uhr

  • @Ratul es bedeutet, dass jeder i wird bei Bedarf und nicht bei der Initialisierung ausgewertet.

    – Onilol

    22. September 2015 um 20:35 Uhr

Benutzer-Avatar
Corey

range erstellt eine Liste, also wenn du das tust range(1, 10000000) es erstellt eine Liste im Speicher mit 9999999 Elemente.

xrange ist ein Generator, also es ist ein Sequenzobjekt ist ein die faul auswertet.

Das ist wahr, aber in Python 3, range() wird von Python 2 implementiert xrange(). Wenn Sie die Liste tatsächlich generieren müssen, müssen Sie Folgendes tun:

list(range(1,100))

  • Ich sehe das nicht als großes Problem (in Bezug auf das Unterbrechen vorhandener Anwendungen), da der Bereich hauptsächlich zum Generieren von Indizes diente, die in for-Schleifen als “for i in range(1, 10):” verwendet werden sollten.

    – Benjamin Autin

    19. September 2008 um 3:52 Uhr

  • +1 Vielen Dank für diese Antwort. Die Informationen darüber, dass Python 3 range durch xrange ersetzt, sind sehr nützlich. Ich habe tatsächlich jemandem gesagt, er solle stattdessen xrange oder range verwenden, und sie sagten, dass es in Python 3 keine Rolle spielt, also habe ich bei Google nach weiteren Informationen gesucht und diese Antwort kam 🙂

    – Cervo

    18. April 2012 um 14:42 Uhr


  • @winterlight, denke, der richtige Begriff dafür ist Iterator. Generatoren sollten auch empfangen können.

    – McSinyx

    23. Mai 2020 um 20:42 Uhr


  • @scign, siehe PEP 342 für die kanonische Definition des Generatorprotokolls. Eine schöne Zusammenfassung findet sich in Typanmerkungsdokumentation (diese werden als alias typing.*).

    – McSinyx

    2. Juli 2020 um 7:30 Uhr

  • Nein, habe ich nicht, @scign. Haben Sie das verlinkte PEP und Dokument gelesen? In der Vergangenheit wurden die beiden Begriffe möglicherweise synonym verwendet, aber zum Zeitpunkt des Schreibens müssen Generatoren in der Lage sein, Werte zu empfangen. Außerdem ist Python 3 Range auch kein Iterator (try next(range(42))).

    – McSinyx

    6. Juli 2020 um 8:54 Uhr


Benutzer-Avatar
John Fouhy

Denken Sie daran, verwenden Sie die timeit Modul, um zu testen, welches der kleinen Codeschnipsel schneller ist!

$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop

Ich persönlich benutze immer range()es sei denn, ich hatte es zu tun Ja wirklich riesige Listen – wie Sie sehen können, beträgt der zusätzliche Zeitaufwand für eine Liste mit einer Million Einträgen nur 0,04 Sekunden. Und wie Corey betont, in Python 3.0 xrange() wird weggehen und range() wird Ihnen sowieso ein nettes Iteratorverhalten geben.

  • +1 für Zeitbeispiel. Hinweis: Um in Windows cmd auszuführen, müssen doppelte Anführungszeichen verwendet werden, dh “. So wird der Code sein python -m timeit "for i in xrange(1000000):" " pass"

    – Stiel

    20. Juni 2012 um 11:48 Uhr

  • Der Hauptvorteil von xrange ist Speicher, nicht Zeit.

    – Endolith

    6. Juni 2014 um 18:18 Uhr

  • +1 für die praktische Antwort: Verwenden Sie die Reichweite, es sei denn, sie ist riesig. Übrigens sind sie konzeptionell identisch, richtig? Seltsamerweise keine Antwort buchstabiert das aus.

    – Bob Stein

    18. August 2014 um 14:54 Uhr


  • Wenn xrange schneller ist und keinen Speicher beansprucht, warum sollte man dann range verwenden?

    – Austin Mohr

    28. August 2014 um 1:21 Uhr

  • Ich stimme Ihrer Aussage grundsätzlich zu, aber Ihre Einschätzung ist falsch: the extra overhead is only 0.04 seconds ist nicht die richtige Art, es zu sehen, (90.5-51.1)/51.1 = 1.771 times slower ist richtig, weil es vermittelt, dass dies, wenn dies die Kernschleife Ihres Programms ist, möglicherweise einen Engpass verursachen kann. Wenn dies jedoch ein kleiner Teil ist, dann ist 1,77x nicht viel.

    – chacham15

    11. Dezember 2014 um 18:22 Uhr


Benutzer-Avatar
efotinis

xrange speichert nur die Bereichsparameter und generiert die Zahlen bei Bedarf. Die C-Implementierung von Python beschränkt ihre Argumente jedoch derzeit auf C-Longs:

xrange(2**32-1, 2**32+1)  # When long is 32 bits, OverflowError: Python int too large to convert to C long
range(2**32-1, 2**32+1)   # OK --> [4294967295L, 4294967296L]

Beachten Sie, dass es in Python 3.0 nur range und es verhält sich wie das 2.x xrange aber ohne die Beschränkungen auf minimale und maximale Endpunkte.

xrange gibt einen Iterator zurück und behält jeweils nur eine Zahl im Speicher. range behält die gesamte Liste der Zahlen im Speicher.

  • xrange tut nicht gibt einen Iterator zurück.

    – Abart

    6. Mai 2015 um 21:46 Uhr

  • and only keeps one number in memory at a time und wo der Rest platziert ist, bitte führen Sie mich..

    – Islam

    1. Dezember 2016 um 16:59 Uhr


  • @SIslam Wenn es Start, Ende und Strom kennt, kann es nacheinander das nächste berechnen.

    – Justin Meiner

    15. Januar 2017 um 4:20 Uhr

Benutzer-Avatar
Sorin

Verbringen Sie etwas Zeit mit dem Bibliotheksreferenz. Je besser Sie sich damit auskennen, desto schneller finden Sie Antworten auf solche Fragen. Besonders wichtig sind die ersten paar Kapitel über eingebaute Objekte und Typen.

Der Vorteil des xrange-Typs besteht darin, dass ein xrange-Objekt unabhängig von der Größe des Bereichs, den es darstellt, immer dieselbe Menge an Speicher benötigt. Es gibt keine konsistenten Leistungsvorteile.

Eine andere Möglichkeit, schnell Informationen zu einem Python-Konstrukt zu finden, ist der docstring und die help-Funktion:

print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)

  • xrange tut nicht gibt einen Iterator zurück.

    – Abart

    6. Mai 2015 um 21:46 Uhr

  • and only keeps one number in memory at a time und wo der Rest platziert ist, bitte führen Sie mich..

    – Islam

    1. Dezember 2016 um 16:59 Uhr


  • @SIslam Wenn es Start, Ende und Strom kennt, kann es nacheinander das nächste berechnen.

    – Justin Meiner

    15. Januar 2017 um 4:20 Uhr

Das Dok lautet eindeutig:

Diese Funktion ist sehr ähnlich zu range()gibt aber ein zurück xrange Objekt anstelle einer Liste. Dies ist ein undurchsichtiger Sequenztyp, der die gleichen Werte wie die entsprechende Liste liefert, ohne sie alle gleichzeitig zu speichern. Der Vorteil von xrange() Über range() ist minimal (seit xrange() muss die Werte immer noch erstellen, wenn danach gefragt wird), außer wenn ein sehr großer Bereich auf einer Maschine mit wenig Speicher verwendet wird oder wenn nie alle Elemente des Bereichs verwendet werden (z. B. wenn die Schleife normalerweise mit beendet wird break).

1139420cookie-checkWas ist der Unterschied zwischen Range- und Xrange-Funktionen in Python 2.X?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy