Geschwindigkeit bei Listen und Klassen

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.
Antworten
Thomas W.
User
Beiträge: 17
Registriert: Sonntag 9. April 2006, 08:36
Wohnort: Halle (Saale)

Dienstag 11. September 2007, 09:54

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.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Dienstag 11. September 2007, 10:01

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 ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Thomas W.
User
Beiträge: 17
Registriert: Sonntag 9. April 2006, 08:36
Wohnort: Halle (Saale)

Dienstag 11. September 2007, 10:23

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:
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Dienstag 11. September 2007, 10:34

Python wird umso langsamer, desto weniger sich man an PEP8 hält.


irgendwie muss man die ja überzeugen
TUFKAB – the user formerly known as blackbird
BlackJack

Dienstag 11. September 2007, 13:17

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:
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Dienstag 11. September 2007, 14:59

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
Antworten