xrange kann mehr als man glaubt!

Code-Stücke können hier veröffentlicht werden.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

xrange kann mehr als man glaubt!

Beitragvon Dookie » Mittwoch 10. November 2004, 20:16

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

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
oenone
User
Beiträge: 75
Registriert: Mittwoch 27. August 2003, 14:39
Wohnort: 49°17'28N, 8°15'57E
Kontaktdaten:

Beitragvon oenone » Donnerstag 11. November 2004, 00:03

ja, xrange ist sehr nuetzlich :)

erwaeht werden sollte auch, dass sie bei zaehlschleifen auch schneller als range ist.

auf bald
oenone
if you don't remember something, it never happened.
if you aren't remembered, you never existed.
i don't quite understand what love is like... but if there was someone who liked me, i'd be happy.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 11. November 2004, 16:13

Ist es möglich mit einem Befehl anzugeigen, wieviel Speicher range(5000) und xrange(5000) belegt???
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 11. November 2004, 16:54

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

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 11. November 2004, 17:16

Schade, ich dachte es gibt da noch einen Befehl, den ich noch nicht kenne ;)

Eigentlich kann man also besser immer xrange() nehmen...
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 11. November 2004, 18:21

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

Code: Alles auswählen

#!/usr/bin/env python
import this
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 12. November 2004, 10:59

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder