Seite 1 von 1
xrange kann mehr als man glaubt!
Verfasst: Mittwoch 10. November 2004, 20:16
von Dookie
Hallo,
ich hab gerade mein PyXO so erweitert, daß auch xrange-Objekte ordentlich gespeichert und geladen werden können. Dabei hab ich etwas mit xrange rumgespielt und bemerkenswerte Eigenschaften entdeckt.
Code: Alles auswählen
>>> a = xrange(10,0,-2)
>>> len(a)
5
>>> a[3]
4
>>> a[-2]
4
>>> import copy
>>> b = copy.copy(a)
>>> print a
xrange(10, 0, -2)
>>> print b
xrange(10, 0, -2)
Ausser slicing und ändern oder erweitern kann xrange so sehr oft und effizient eine Liste von Integern mit fester Schrittweite ersetzen.
Gruß
Dookie
Verfasst: Donnerstag 11. November 2004, 00:03
von oenone
ja, xrange ist sehr nuetzlich
erwaeht werden sollte auch, dass sie bei zaehlschleifen auch schneller als range ist.
auf bald
oenone
Verfasst: Donnerstag 11. November 2004, 16:13
von jens
Ist es möglich mit einem Befehl anzugeigen, wieviel Speicher range(5000) und xrange(5000) belegt???
Verfasst: Donnerstag 11. November 2004, 16:54
von Dookie
Hi jens,
hmm da müsste man den Speicherverbrauch mit einem Tool überwachen. jedenfalls braucht range(5000) den Speicher für ein list-Objekt und dann noch für 5000 int-Objekte, range liefert ja eine fertige Liste mit Integerwerten. xrange(5000) braucht nur den Speicher für ein xrange-Objekt also nur den Bruchteil von range.
Gruß
Dookie
Verfasst: Donnerstag 11. November 2004, 17:16
von jens
Schade, ich dachte es gibt da noch einen Befehl, den ich noch nicht kenne
Eigentlich kann man also besser immer xrange() nehmen...
Verfasst: Donnerstag 11. November 2004, 18:21
von Dookie
Ja du kannst immer xrange nehmen, ausser du brauchst wirklich eine Liste. Ich tu mir schon schwer nur range zu tippen, meine Finger tippen schon automatisch xrange
Gruß
Dookie
Verfasst: Freitag 12. November 2004, 10:59
von Milan
Hi, ja das haben sie im Rahmen von Python 2.3 eingeführt, dass xrange __len__ und indizies unterstützt, damit du slicen kannst und umgekehrt iterieren... Finde ich ein wenig umständlich, aber nützlich. Man könnte dast dazu übergehen, range einfach nur als list(xrange(...)) zu definieren

.