[Python-de] War die Idee mit Iteratoren/Generatoren wirklich so super?

Diez B. Roggisch deets at web.de
Di Jul 25 04:49:34 EDT 2017


> On 25. Jul 2017, at 10:14, Thomas Güttler <guettliml at thomas-guettler.de> wrote:
> 
> Anfangs war ich total begeistert von Iteratoren und Generatoren.
> 
> Die Begeisterung ist nicht mehr vorhanden, schließlich ist es nichts Neues und darum auch nichts Spannendes mehr.
> 
> Wenn ich zum Debugging etwas untersuchen will, und dann das hier finde:
> 
>  <generator object get_foo_bars at 0x7f1d3bb416e0>
> 
> ... Dann ist ein weiterer "Edit, Compile, Run Cycle" nötig.
> 
> Dieser "Cycle" geht in Python schnell, aber trotzdem nervt es ein klitzekleinesbischen.
> 
> Ich frage mich: Bringt der Einsatz von Iteratoren und Generatoren wirklich so viel?
> 
> Sicherlich gibt es extreme Beispiele bei denen die Datenmenge nicht in den Hauptspeicher passen würde.
> 
> Aber solche Datenmengen habe ich im PostgreSQL, und ich mache auch Schleifchen über alle Daten
> in der DB :-)
> 
> Wie seht ihr das?

Es geht nicht nur um Datenmengen, sondern auch um Algorithmen. Wenn ich eine rekursive Datenstruktur dank eines Generators traversieren kann, ohne dabei gleich die Prozessierung reinzuwurschteln, dann ist das architektonisch ein Gewinn. Natuerlich kann man das auch irgendwie anders machen, mit callbacks oder Visitor-Pattern, aber das ist halt knoedelig.

Ausserdem verstehe ich dein Argument nicht. Wenn ich debugge, benutze ich PDB. Und wenn ich einen Generator habe, dann kann ich ja nun auch in dessen Ausfuehrung einspringen. Siehe unten. Du kannst ja auch keinen Breakpoint in eine List-Comprehension setzen, machst du deswegen auch keine?

Und last but not least glaubst du nur, dass du schleifen machst in der DB. Im Zweifel arbeitet die nur auf Index-Strukturen etc, und wenn du rausfinden willst, warum der Execution-Planer einen full table scan macht, obwohl doch eigentlich der Index genutzt werden sollte, dann stehst du vor einer noch schwaerzeren Box als deinem Generator.

Diez


#!/usr/bin/env python3

def bar():
    for i in range(100):
        yield i


def main():
    import pdb; pdb.set_trace()
    for foo in bar():
        print(foo)

if __name__ == '__main__':
    main()



-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 496 bytes
Beschreibung: Message signed with OpenPGP
URL         : <http://mail.python.org/pipermail/python-de/attachments/20170725/f72eb08c/attachment.sig>


Mehr Informationen über die Mailingliste python-de