463 Stimmen

Sollten Sie immer xrange() gegenüber range() bevorzugen?

Warum oder warum nicht?

448voto

Brian Punkte 112487

Für die Leistung, vor allem, wenn Sie über einen großen Bereich iteriert werden, xrange() ist in der Regel besser. Es gibt jedoch noch einige Fälle, in denen Sie Folgendes vorziehen könnten range() :

  • In Python 3, range() tut was xrange() zu tun pflegte und xrange() gibt es nicht. Wenn Sie Code schreiben wollen, der sowohl unter Python 2 als auch unter Python 3 läuft, können Sie nicht xrange() .

  • range() kann in manchen Fällen tatsächlich schneller sein - z.B. wenn man dieselbe Sequenz mehrmals durchläuft. xrange() muss das Integer-Objekt jedes Mal rekonstruieren, aber range() wird echte ganzzahlige Objekte haben. (Es wird jedoch immer schlechter in Bezug auf den Speicher durchführen)

  • xrange() ist nicht in allen Fällen verwendbar, in denen eine echte Liste benötigt wird. Zum Beispiel unterstützt es keine Slices oder Listenmethoden.

[Bearbeiten] In einigen Beiträgen wird erwähnt, wie range() wird durch das 2to3-Tool aufgewertet. Für das Protokoll, hier ist die Ausgabe der Ausführung des Werkzeugs auf einige Beispielverwendungen von range() y xrange()

RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: ws_comma
--- range_test.py (original)
+++ range_test.py (refactored)
@@ -1,7 +1,7 @@

 for x in range(20):
-    a=range(20)
+    a=list(range(20))
     b=list(range(20))
     c=[x for x in range(20)]
     d=(x for x in range(20))
-    e=xrange(20)
+    e=range(20)

Wie Sie sehen, bleibt der Bereich unverändert, wenn er in einer for-Schleife oder in einer comprehension verwendet wird, oder wenn er bereits mit list() umbrochen wurde.

130voto

Dan Lenski Punkte 72055

Nein, sie haben beide ihren Nutzen:

Utilisez xrange() bei der Iteration, da es Speicher spart. Sagen Sie:

for x in xrange(1, one_zillion):

statt:

for x in range(1, one_zillion):

Auf der anderen Seite, verwenden Sie range() wenn Sie tatsächlich eine Liste von Zahlen wünschen.

multiples_of_seven = range(7,100,7)
print "Multiples of seven < 100: ", multiples_of_seven

42voto

Thomas Wouters Punkte 124421

Sie sollten Folgendes bevorzugen range() über xrange() nur, wenn Sie eine tatsächliche Liste benötigen. Zum Beispiel, wenn Sie die Liste ändern wollen, die von range() oder wenn Sie es in Scheiben schneiden wollen. Für Iteration oder auch nur normale Indizierung, xrange() funktioniert gut (und in der Regel viel effizienter). Es gibt einen Punkt, an dem range() ist ein wenig schneller als xrange() für sehr kleine Listen, aber abhängig von Ihrer Hardware und verschiedenen anderen Details kann die Gewinnschwelle bei einem Ergebnis der Länge 1 oder 2 liegen; nichts, worüber man sich Sorgen machen müsste. Bevorzugen Sie xrange() .

31voto

Brian Minton Punkte 2927

Ein weiterer Unterschied ist, dass die Python 2-Implementierung von xrange() kann keine Zahlen unterstützen, die größer als C-Ints sind. Wenn Sie also einen Bereich haben wollen, der Pythons eingebaute Unterstützung für große Zahlen nutzt, müssen Sie range() .

Python 2.7.3 (default, Jul 13 2012, 22:29:01) 
[GCC 4.7.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> range(123456787676676767676676,123456787676676767676679)
[123456787676676767676676L, 123456787676676767676677L, 123456787676676767676678L]
>>> xrange(123456787676676767676676,123456787676676767676679)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long

Bei Python 3 gibt es dieses Problem nicht:

Python 3.2.3 (default, Jul 14 2012, 01:01:48) 
[GCC 4.7.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> range(123456787676676767676676,123456787676676767676679)
range(123456787676676767676676, 123456787676676767676679)

13voto

Dan Udey Punkte 2985

xrange() ist effizienter, weil es statt einer Liste von Objekten nur ein Objekt nach dem anderen erzeugt. Anstelle von 100 Ganzzahlen und dem gesamten Overhead und der Liste, in die sie eingefügt werden müssen, haben Sie nur eine Ganzzahl auf einmal. Schnellere Erzeugung, bessere Speichernutzung, effizienterer Code.

Wenn ich nicht gerade eine Liste für etwas brauche, bevorzuge ich immer xrange()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X