[Sinn/Unsinn] Frage zu Generatoren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

[Sinn/Unsinn] Frage zu Generatoren

Beitragvon EnTeQuAk » Dienstag 21. August 2007, 11:36

Hallo alle zusammen!

Ich zerbreche mir in letzter Zeit ein wenig den Kopf über die Anwendung eines Generators, im Gegensatz zu einem Iterierbaren Gegenstand.

Zum Hintergrund:

Es gibt einen TokenStream, welcher sich fast exakt wie ein Generator verhällt aber intern mit 'deque's arbeitet, um die Werte darzustellen. Er unterstützt das vorrausschauen und das wieder einspeisen von Tokens.

Nun die Frage: Macht es sinn, die übergebene 'iterable' zu einem Generator zu transferieren

Code: Alles auswählen

self.stack = (x for x in iterable)

Und dadurch aus dem TokenStream wieder einen richtigen Generator zu machen, der nicht sämtliche Werte vorhällt sondern nur mit gerade benötigte beziehungsweise neue Werte, die nicht im vorherigen 'iterable' enthalten waren arbeitet.

Die Frage wollte ich gerne an euch weiterreichen, da es mich interessiert.

Was haltet ihr davon, Vor/Nachteile?

MfG EnTeQuAk
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 21. August 2007, 12:22

Hi

Code: Alles auswählen

(x for x in iterable)


Bei diesem Code seh ich nur unsinn ... Wenn du ja schon ein iterable hast warum nochmals ein iterable daraus machen?

Gruss
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: [Sinn/Unsinn] Frage zu Generatoren

Beitragvon Leonidas » Dienstag 21. August 2007, 14:05

EnTeQuAk hat geschrieben:Nun die Frage: Macht es sinn, die übergebene 'iterable' zu einem Generator zu transferieren

Code: Alles auswählen

self.stack = (x for x in iterable)

Und dadurch aus dem TokenStream wieder einen richtigen Generator zu machen, der nicht sämtliche Werte vorhällt sondern nur mit gerade benötigte beziehungsweise neue Werte, die nicht im vorherigen 'iterable' enthalten waren arbeitet.

Nein, das funktioniert doch auch gar nicht (na gut,funktionieren tut es schon, aber es ist mehr oder weniger wirkungslos). Wenn du sagen wir mal, eine Liste zu einem Generator machst, dann muss der Generator doch die Werte die er ausspuckt doch trotzdem noch irgendwo herbekommen - die nimmt er sich aus der Liste. Also hast du damit keine Speicherersparnis (weil die Liste ja mitgespeichert werden muss) und kein Lazy-Verhalten (weil die Liste ja schon im vorhinein feststeht).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Beitragvon lunar » Dienstag 21. August 2007, 14:09

Generator-Ausdrücke machen nur Sinn, wenn du die Werte des Iterables verändern willst...
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Dienstag 21. August 2007, 14:37

Leonidas hat geschrieben:Nein, das funktioniert doch auch gar nicht (na gut,funktionieren tut es schon, aber es ist mehr oder weniger wirkungslos). Wenn du sagen wir mal, eine Liste zu einem Generator machst, dann muss der Generator doch die Werte die er ausspuckt doch trotzdem noch irgendwo herbekommen - die nimmt er sich aus der Liste. Also hast du damit keine Speicherersparnis (weil die Liste ja mitgespeichert werden muss) und kein Lazy-Verhalten (weil die Liste ja schon im vorhinein feststeht).

Ok
lunar hat geschrieben:Generator-Ausdrücke machen nur Sinn, wenn du die Werte des Iterables verändern willst...


Herzlichen Dank euch dreien!

Mir ging es ja hauptsächlich um die Speicherersparnis. Ich hätte da jetzt eventuell gedacht, das die vorherige Liste irgentwie... keine Ahnung verschwindet oder so xD

Aber das würde ja auch keinen Sinn machen.


Aber wo wir gerade bei dem Thema sind: Generatoren. Sagen wir mal, wir haben folgende Funktion

Code: Alles auswählen

def gen_gen():
    for i in xrange(1, 100):
        yield i*2

Wie genau wird jetzt der Generator abgebildet, wenn er *nicht* Die ausgerechneten Zahlen vorhält. Ungefair so?
(das, was jetzt wie ein Tupel ausschaut, ist jetzt einfach mal mein Generator)

Code: Alles auswählen

(1*2, 2*2, 3*2, 4*2, 5*2)

(usw.)

Oder liege ich da wieder falsch?

MfG EnTeQuAk
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Dienstag 21. August 2007, 14:53

Der Generator ist ein Python-Objekt, das eine Referenz zu einem Frameobjekt hält (so ein Frame, wie ihn `sys._getframe()` zurückgibt).
Der Frame hat alle Informationen über das Innere der Generatorfunktion, also z.B. Bytecode, momentane Position im Code, Locals, Globals etc.

Instanziert man einen Generator (mit `gen()`), werden erst einmal nur dieses Objekt und der Frame erzeugt. Ruft man dann die Methode `next()` des Generators auf, lässt er diesen Frame dann vom Eval-Loop ausführen. Der läuft dann bis zum nächsten `yield` -- dies unterbricht die Ausführung des Generatorframes und lässt den vorherigen Frame weiterlaufen, etc.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 21. August 2007, 15:26

Ich hab das mal ins wiki gepackt: [wiki]Allgemeine Begriffe#G[/wiki]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Dienstag 21. August 2007, 15:28

Nur leider unter dem flscahen Begriff... hier ging es um Generatoren allgemein.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]