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 :wink: .