Seite 1 von 1

Geschwindigkeit bei Listen und Klassen

Verfasst: Dienstag 11. September 2007, 09:54
von Thomas W.
Ich habe ein gerade etwas mit Klassen rumgespielt. Dabei habe ich festgestellt, dass Python extrem lange braucht, um eine Instanz wieder zu entfernen.

Code: Alles auswählen

class teste:
    def __init__(self,Name):
        self.Name=Name
    
if __name__ == "__main__":
    Sammelbox = []

    for i in range(1000):
        Sammelbox.append(teste(i))

    while len(Sammelbox) <> 0:
        Sammelbox.remove(Sammelbox[len(Sammelbox)-1])
Mehr als als 95% der Laufzeit verschlingt die remove-Funktion der "Sammelbox". Bei einfachen Zahlen braucht sie nicht so lange, deshalb vermute ich, dass der Zeitverbrauch an den Instanzen liegt.

Kann mir jemand weiterhelfen? Ich wüsste gerne wo die Zeit wirklich bleibt und wie ich etwas mehr Speed in die Routine bringen kann.

Verfasst: Dienstag 11. September 2007, 10:01
von veers
Ich behaupte mal das der grösste Teil der Zeit damit verbracht wird die Elemente in der Liste zu finden.

Ansonsten wirkt der Code auch ziemlich komisch. Wenn du Element n löschen willst kannst du das mit del Sammelbox[n] bewerkstelligen. Wenn du über alle Elemente iterieren willst ein for element in Sammelbox. Wenn du eine Liste einfach leeren willst kannst du das mit del Sammelbox[:] machen.

Gruss,
Jonas

PS: Schau dir mal PEP8 an ;)

Verfasst: Dienstag 11. September 2007, 10:23
von Thomas W.
Danke für die schnelle Antwort.
veers hat geschrieben:Ich behaupte mal das der grösste Teil der Zeit damit verbracht wird die Elemente in der Liste zu finden.

Ansonsten wirkt der Code auch ziemlich komisch. Wenn du Element n löschen willst kannst du das mit del Sammelbox[n] bewerkstelligen.
Ich habe es jetzt mal mit del versucht, es geht sehr viel schnell, deine Vermutung war daher wohl richtig. Es war mir nicht mehr klar, das Python bei diesem Konstrukt erst den entsprechenden Eintrag sucht.
veers hat geschrieben:Wenn du über alle Elemente iterieren willst ein for element in Sammelbox. Wenn du eine Liste einfach leeren willst kannst du das mit del Sammelbox[:] machen.
Gruss,
Jonas

PS: Schau dir mal PEP8 an ;)
Danke auch für die Hinweise zur Ansprache der Element in Listen.

Im stehe bei Python noch ziemlich am Anfang, so dass man mir - und ich mir auch - den einen oder anderen ungewöhnlichen Code verzeihen wird. :wink:

Verfasst: Dienstag 11. September 2007, 10:34
von mitsuhiko
Python wird umso langsamer, desto weniger sich man an PEP8 hält.


irgendwie muss man die ja überzeugen

Verfasst: Dienstag 11. September 2007, 13:17
von BlackJack
Der ist gut, den merk ich mir. :-)

Ob man wohl so etwas wie `pylint` in den Compiler einbauen, und dann je nach Bewertung künstliche Verzögerungen einbauen kann. :twisted:

Verfasst: Dienstag 11. September 2007, 14:59
von EnTeQuAk
BlackJack hat geschrieben:Der ist gut, den merk ich mir. :-)

Ob man wohl so etwas wie `pylint` in den Compiler einbauen, und dann je nach Bewertung künstliche Verzögerungen einbauen kann. :twisted:
Lieber nicht, denn Pylint bewertet meinen Code immer etwas "zu Hart" und gibt mir komische Fehlermeldungen bei Importen, wie

Code: Alles auswählen

from jinja import Environment as JinjaEnvironment
Mit solchen Sachen kommpt Pylint z.B. absolut nicht aus ;(


An den Threadsteller:

Performancetests sind eine Kunst für sich. Und die Sinnhaftiggkeit solcher Tests ist in vielen Fällen anzuzweifeln. (Frage Jens, der hat solche Aussagen oft genug gehört :D)

Deinen Code etwas schöner zu schreiben ist jedenfalls auch nicht schwer:

Code: Alles auswählen

In [1]: class Test(object):
   ...:     def __init__(self, name):
   ...:         self.name = name
Denn, Klassen werden in CamelCase geschrieben. Attribute / Variablen / Funktionen und Methoden werden mit Unterstrichen verbunden:

Code: Alles auswählen

def ich_bin_ein_funktionsname():
    return "TEST"
Um die Box zu füllen, kannst du auch eine list-comprehension verwenden:

Code: Alles auswählen

In [3]: box = [Test(i) for i in xrange(1000)]
Und um die Box wieder komplett zu leeren (nicht zu löschen), kannst du das `del` statement verwenden:

Code: Alles auswählen

del box[:]

MfG EnTeQuAk