2010-04-24 5 views
18

Ich schaue auf einige Code, der viele Sortieraufrufe mit Vergleichsfunktionen hat, und es scheint, wie es Schlüsselfunktionen verwenden sollte.Lambda vs Operator.Trgetter ('xxx') als Sortierschlüssel Funktion in Python

Wenn Sie waren seq.sort(lambda x,y: cmp(x.xxx, y.xxx)) zu ändern, was vorzuziehen ist:

seq.sort(key=operator.attrgetter('xxx')) 

oder:

seq.sort(key=lambda a:a.xxx) 

ich auch in den Kommentaren über die Vorteile der Änderungen an vorhandenen Code interessiert sein würde, das funktioniert.

Antwort

17

"Änderungen an existierendem Code, der funktioniert" ist die Entwicklung von Programmen ;-). Schreiben Sie eine gute Testbatterie, die bekannte Ergebnisse mit dem vorhandenen Code liefert, speichern Sie diese Ergebnisse (die normalerweise in einem Testkontext als "goldene Dateien" bezeichnet werden); Nehmen Sie dann die Änderungen vor, führen Sie die Tests erneut aus und verifizieren Sie (idealerweise auf automatisierte Weise), dass die einzigen Änderungen an den Testergebnissen diejenigen sind, die spezifisch sind - keine unerwünschten oder unerwarteten Nebenwirkungen. Man kann natürlich anspruchsvollere Qualitätssicherungsstrategien anwenden, aber das ist der Kern vieler "Integrationstests".

Wie für die zwei Möglichkeiten, einfache key= Funktion zu schreiben, war die Entwurfsabsicht, operator.attrgetter schneller zu machen, indem sie spezialisierter, aber zumindest in aktuellen Versionen von Python gibt es keinen messbaren Unterschied in der Geschwindigkeit. Für diese spezielle Situation würde ich die lambda empfehlen, einfach weil es prägnanter und allgemeiner ist (und ich bin normalerweise kein Lambda-Liebhaber, wohlgemerkt! -).

+7

ich stimme mit Alexanders Antwort überein (das ist er ist kein Lambda-Liebhaber) :-) aber auch Sekunde die Vorstellung des Lambda. Im obigen Beispiel ist es vielleicht ein kleines bisschen schneller, weil Sie weder 'operator' noch' operator.attrgetter() 'suchen müssen ... Sie haben das eigentliche Funktionsobjekt bereits! es ist jedoch kaum wahrnehmbar, wie alex schon gesagt hat, aber die "lambda" -Lösung gewinnt Python-Zen-Punkte, da sie einfacher zu lesen ist. – wescpy

+0

Danke, Alex und Wesley! – PaulMcG

Verwandte Themen