Es ist seltsam, wie unterschiedlich die Schönheit für verschiedene Menschen ist. Ich finde das Listenverständnis viel klarer als filter
+ lambda
, benutze aber das, was du leichter findest.
Es gibt zwei Dinge, die Ihre Verwendung verlangsamen können filter
.
Der erste ist der Overhead des Funktionsaufrufs: Sobald Sie eine Python-Funktion verwenden (unabhängig davon, ob sie von def
oder erstellt wurde lambda
), ist der Filter wahrscheinlich langsamer als das Listenverständnis. Es ist mit ziemlicher Sicherheit nicht genug, um eine Rolle zu spielen, und Sie sollten nicht viel über die Leistung nachdenken, bis Sie Ihren Code zeitlich festgelegt und festgestellt haben, dass es sich um einen Engpass handelt, aber der Unterschied wird da sein.
Der andere Aufwand, der möglicherweise anfällt, besteht darin, dass das Lambda gezwungen wird, auf eine Gültigkeitsbereichsvariable ( value
) zuzugreifen . Das ist langsamer als der Zugriff auf eine lokale Variable und in Python 2.x greift das Listenverständnis nur auf lokale Variablen zu. Wenn Sie Python 3.x verwenden, wird das Listenverständnis in einer separaten Funktion ausgeführt, sodass der Zugriff auch value
über einen Abschluss erfolgt und dieser Unterschied nicht gilt.
Die andere zu berücksichtigende Option ist die Verwendung eines Generators anstelle eines Listenverständnisses:
def filterbyvalue(seq, value):
for el in seq:
if el.attribute==value: yield el
Dann haben Sie in Ihrem Hauptcode (wo die Lesbarkeit wirklich wichtig ist) sowohl das Listenverständnis als auch den Filter durch einen hoffentlich aussagekräftigen Funktionsnamen ersetzt.
filter
besser lesbar ist. Wenn Sie einen einfachen Ausdruck haben, der unverändert in einem Listencomputer verwendet werden kann, aber in ein Lambda (oder ein ähnliches Konstrukt auspartial
oderoperator
Funktionen usw.) eingeschlossen werden muss, an das übergeben werdenfilter
soll, dann gewinnen Listcomps.