Warum oder warum nicht?
Antworten
Zu viele Anzeigen?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 wasxrange()
zu tun pflegte undxrange()
gibt es nicht. Wenn Sie Code schreiben wollen, der sowohl unter Python 2 als auch unter Python 3 läuft, können Sie nichtxrange()
. -
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, aberrange()
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.
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
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()
.
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)
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()
- See previous answers
- Weitere Antworten anzeigen