Verfasst: Dienstag 29. April 2008, 13:02
Hier geht es zur Doku von "operator.itemgetter".
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
die itemgetter-Funktion ist schneller als die lambda-Funktion.sea-live hat geschrieben:mich stört halt nur das lamda bereits ab 2.4 für diese dinge optimiert wurde
Gerade getestet: Die lambda-Variante ist kompiliert größer als die itemgetter-Variante:ich soll nun fürs bessere verständniss eine bibliotek nachladen was
beim compalieren dann zusätzlichen platz beansprucht.
Code: Alles auswählen
l = [[1,2,3,4]]
print filter(lambda x: x[2], l)
Code: Alles auswählen
import operator
l = [[1,2,3,4]]
print filter(operator.itemgetter(2), l)
Quatsch. Lambda ist schon seit fast immer da (mindestens seit 1.5.x), die Überlegung war sogar, es für Python 3.0 wegzulassen, da viele Anwendungsbereiche für lambdas durch andere Konstrukte übernommen worden sind, etwa ``filter()`` und ``map()`` durch List Comprehensions, Attribut und Indexzugriff durch Itemgetter und Attrgetter, etc.sea-live hat geschrieben:mich stört halt nur das lamda bereits ab 2.4 für diese dinge optimiert wurde
und in den standart namensraum übernommmen wurde
Ich habe letztens ein Programm geschrieben, in dem ich reihenweise Scheme Grundfunktionen nachgebaut habe, aber sonderlich gut war das Programm nicht. Ich würde lieber Funktionen der Stdlib verwenden, als sie einfach so nachzubauen.sea-live hat geschrieben:Diskusion erwünscht minimalismuss gefordert beim Programmieren!
Oben gibt es ja schon ein Link, in der neuen Doku sind allerdings auch Beispiele: [mod]operator#operator.itemgetter[/mod]sea-live hat geschrieben:kann mal jemand diesen ominösen docu link hier einstellen
Ich nicht. `itemgetter` sieht vielleicht sauberer aus, aber mich stört der zusätzliche Import sehr. Wenn `itemgetter` im Standard-Namespace *wäre*, würde ich es verwenden, aber so ist das Lambda-Konstrukt trotzdem handlicher - plus die Flexibilität, es später noch anzupassen, wenn man die Datenstruktur ändern sollte.EyDu hat geschrieben:Außerdem würde man statt deinem Lambda-Ausdruck 'operator.itemgetter("Date")' verwenden.
Und die von `lambda` nicht? Dann habe ich wohl 'ne andere Doku als du :pLeonidas hat geschrieben:Weil die Funktionalität von itemgetter dokumentiert ist und man nicht überlegen muss was irgendwelche Funktionen machen.
Das ist soweit ich das sehe nur eine Mutmaßung.Leonidas hat geschrieben:Außerdem ist er womöglich auch schneller.
Du Funktionalität von ``lambda`` schon, die von diesem speziellen Lambda nicht.Y0Gi hat geschrieben:Und die von `lambda` nicht? Dann habe ich wohl 'ne andere Doku als du :pLeonidas hat geschrieben:Weil die Funktionalität von itemgetter dokumentiert ist und man nicht überlegen muss was irgendwelche Funktionen machen.
``itemgetter()`` ist immerhin in C implementiert, das ``lambda`` ist Python-Code, daher ist die Mutmaßung gar nicht mal so abwegig.Y0Gi hat geschrieben:Das ist soweit ich das sehe nur eine Mutmaßung.Leonidas hat geschrieben:Außerdem ist er womöglich auch schneller.
Dann müsste ich dir im Falle von `lambda x: x[0]` unterstellen, dass du Lambdas nicht verstanden hast. Ein noch einfacheres Beispiel gibt es wohl kaum.Leonidas hat geschrieben:Du Funktionalität von ``lambda`` schon, die von diesem speziellen Lambda nicht.
Es ging mir nicht darum, ob ich einen Import vertreten kann. Bei etwas aus der Stdlib geht das auf jeden Fall. Vielmehr stört mich, dass ich für ein so einfaches Konstrukt überhaupt etwas importieren muss*, wodurch mein gedanklicher Fluss beim Programmieren zumindest kurzzeitig unterbrochen wird. Dabei ist es ein gerne und zu Recht angeführtes Argument, dass man in Python sehr direkt und ohne Umschweife, etwa im Vergleich zu C, ein Problem bzw. dessen Lösung umsetzen kann.Leonidas hat geschrieben:Über den Import zu Argumentieren finde ich eher langweilig. Ich importiere in meinen Programmen was ich will, da muss ich mir im Fall der Stdlib keine Sorgen machen ob es installiert ist oder nicht.
Man könnte auch alle Funktionen im operator-Modul als "einfach" ansehen und sich fragen, warum man die erst importieren muss. Aber das würde den Namensraum ziemlich zumüllen.Y0Gi hat geschrieben:Es ging mir nicht darum, ob ich einen Import vertreten kann. Bei etwas aus der Stdlib geht das auf jeden Fall. Vielmehr stört mich, dass ich für ein so einfaches Konstrukt überhaupt etwas importieren muss*, wodurch mein gedanklicher Fluss beim Programmieren zumindest kurzzeitig unterbrochen wird. Dabei ist es ein gerne und zu Recht angeführtes Argument, dass man in Python sehr direkt und ohne Umschweife, etwa im Vergleich zu C, ein Problem bzw. dessen Lösung umsetzen kann.
Ohne Callable ist das ja auch nichts kompliziertes:Y0Gi hat geschrieben:Nur so eine Idee: Gibt es nicht eine entsprechende Methode `__foo__`, die `itemgetter()` entspricht und die man zur Vermeidung des Imports von einem "rumliegenden" Typ oder Objekt abgreifen kann?
Code: Alles auswählen
>>> import operator
>>> l = range(5)
>>> operator.itemgetter(2)
<operator.itemgetter object at 0x81a8dcc>
>>> i2 = operator.itemgetter(2)
>>> i2(l)
2
>>> l.__getitem__(2)
2
Code: Alles auswählen
>>> def yogi_itemgetter(index):
... def actual_getter(obj):
... return obj[index]
... return actual_getter
...
>>> yi2 = yogi_itemgetter(2)
>>> yi2(l)
2
Code: Alles auswählen
In [41]: operator.itemgetter(1,3,0)('hallo')
Out[41]: ('a', 'l', 'h')