[Python-de] Quadratische Laufzeit oder?

Achim Domma domma at procoders.net
So Sep 28 12:09:35 CEST 2014


Nö, da liegst du falsch. Wobei dein Beispiel irgendwie sehr unnötig verschachtelt ist und daher schwer zu entwirren, wenn man deinen eigentlich use case nicht kennt. Kannst du etwas genauer beschreiben, was du überhaupt vor hast? So ganz grob vorab:

- Du übergibst __init__ einen Iterator. Über den kannst du nur einmal iterieren. Die Klasse suggeriert aber etwas anderes. Du kannst ja mal versuchen, "for item in obj" ein zweites mal aufzurufen.

- __iter__ soll einen Interator zurückliefern. Das passiert in deinem Fall, aber dir ist scheinbar nicht klar warum.

- next() liefert nicht das nächste Element, sondern - dank yield - einen Iterator, der über den ursprünglichen Iterator iteriert.

Alles in allem ist dein reduziertes Beispiel eine Klasse, die das Iterieren über einen Iterator kapselt und das nicht so ganz sauber. Für mich ergibt das wenig Sinn. Für weitere Hilfe müßtest du uns also, wie schon gesagt, mehr Details dazu zukommen lassen, was du überhaupt erreichen willst.

Grüße,
Achim


Am 28.09.2014 um 10:44 schrieb Albert Hermeling:

> Guten Morgen,
> 
> In einen kleinen Programm gibt es eine Klasse die einen Iterator bereitstellt. Hier ein Beispiel was ich meine
> 
> class Foo():
>    def __init__(self,iter_):
>        self.iter_ = iter_
>    def __iter__(self,):
>        return self.next()
>    def next(self,):
>        for item in self.iter_:
>            yield item
> 
> Normalerweise wird nur die Iterator-Funktion gebraucht, also das hier:
> 
> obj = Foo(range(0,100))
> for item in obj:
>    mach_was_mit_item(item)
> 
> Aber manchmal will man die Komplette Liste haben, also das hier:
> obj = list(Foo(range(0,100)))
> 
> Beim darüber nachdenken, kam mir der Gedanke das der Algorithmus dadurch eine quadratische Laufzeit also O(n^2) bekommt. Den es wird ja in next() von Foo "for for item in self.iter_" durchlaufen und durch das "list(Foo(range(0,100)))", startet der Python-Interpreter doch auch eine interne for Schleife, oder bin ich da auf den Holzweg? Auf irgendeiner Art, Weise muss Python doch jedes Element in der Liste einmal erreichen. Im Beispiel ist es hier range() im wirklichen "Leben" handelt es sich dabei aber um eine Byte-Struktur.
> 
> Mit freundlichen Grüßen
> 
> Albert Hermeling
> 
> 
> 
> _______________________________________________
> python-de maillist  -  python-de at python.org
> https://mail.python.org/mailman/listinfo/python-de



Mehr Informationen über die Mailingliste python-de