sfx2k hat geschrieben:
Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
Okay, dann erkläre mir doch bitte, warum drei Posts vorher laut nezzcarth noch ein Set besser geeignet war als eine Liste, da ich deren Funktionalitäten gar nicht benötige, und jetzt genau andersrum?
Weil Du da noch *ohne* reguläre Ausdrücke geprüft hast, ob ein Wort in einer *Menge* vorkommt. Du hattest eine Liste genommen, die beim ``in`` Operator jedes Mal schlimmsten Falls komplett durchlaufen werden muss (das beschreibt man auch mit O(n)). Bei einer Menge kann der ``in`` Operator in *konstanter* Zeit (O(1)) ermitteln, ob ein Element in einer Liste ist.
Das kann man in einer Python-Shell (hier iPython) leicht nachprüfen:
Code: Alles auswählen
In [1]: values = list(range(10000000))
In [3]: some_value = 9999999
In [4]: timeit some_value in values
1 loops, best of 3: 305 ms per loop
In [5]: values = set(range(10000000))
In [6]: timeit some_value in values
10000000 loops, best of 3: 147 ns per loop
Beachte die Dauer - Millisekunden vs Nanosekunden! Meine Testzahl ist natürlich so schlecht wie möglich für die Liste gewählt, da sie dort die *letzte* Position hat. ``in`` muss also *alle* Einträge durchlaufen, bevor er auf die gewünschte Zahl trifft.
Auch eine nicht vorhandene Zahl muss natürlich immer alle Elemente durchlaufen.
Bei Sammlungen, die auf Hashing basieren (Sets, Dictionaries), kann dies *unabhängig* von der Größe der Sammlung immer in konstanter Zeit erreicht werden.
Edit: Noch einmal zur Verdeutlichung eine Reduktion der Anzahl um den Faktor 10 also von 10 Millionen auf eine Million Elemente. Man erkennt schön, wie der Listen basierte Zugriff sich *linear* um den Faktor reduziert (30ms vs 300ms), wohingegen der Mengen basierte Ansatz gleich geblieben ist:
Code: Alles auswählen
In [14]: some_value = 999999
In [15]: values = list(range(1000000))
In [16]: timeit some_value in values
10 loops, best of 3: 30.6 ms per loop
In [17]: values = set(range(1000000))
In [18]: timeit some_value in values
10000000 loops, best of 3: 145 ns per loop
sfx2k hat geschrieben:
Muss ich, wenn ein File in einer with-Anweisung geöffnet wird, dieses nicht auch wieder schließen?
Nein, eben nicht!
(Das ist ja das tolle; das passiert übrigens auch bei Ausnahmen!)