Reduzieren Listenverständnisse in Python speichereffizient?
Frage
Ich bin ein Anfänger bei Python und dies ist mein erster Beitrag, also sei nicht zu hart :).Ich habe in letzter Zeit mit Python herumgespielt und mich gefragt, ob so etwas wie
max([x for x in range(25)])
würde dazu führen, dass Python zuerst eine Liste aller Elemente erstellt und dann das Maximum ermittelt, was zu einer O (2n) -Zeit führt, oder es würde das Maximum verfolgen, während es für Θ (n) iteriert.Da sich der Bereich in Python3 unterscheidet (da er iterierbar ist), würde er sich dadurch von Python2 unterscheiden?
Lösung
Ihr Beispiel führt dazu, dass Python zuerst die gesamte Liste erstellt.Wenn Sie dies vermeiden möchten, können Sie stattdessen einen Generatorausdruck verwenden:
max((x for x in range(25)))
oder einfach:
max(x for x in range(25))
Natürlich (in Python 2) erstellt range
selbst eine ganze Liste. In diesem Fall möchten Sie also wirklich:
max(x for x in xrange(25))
In Bezug auf die benötigte Zeit haben jedoch alle diese Ausdrücke die gleiche Komplexität.Der wichtige Unterschied besteht darin, dass der letzte O (1) -Raum benötigt, während die anderen O (n) -Raum benötigen.
Andere Tipps
Listenverständnisse generieren immer eine Liste (es sei denn, etwas löst eine Ausnahme aus).In den meisten Fällen wird die Verwendung eines Genex empfohlen.
max(x for x in xrange(25))