Tail Call Optimization in Python

Anfang des Monats hab ich mich noch darüber geärgert, das GvR keine Tail-Call Optimierung in Python will - weil er meint, das wäre ein Feature das kein einfaches Interface haben kann. Auf [Lambda the Ultimate] gibts dazu auch einen Kommentar - denn logischerweise hat dieses Statement von GvR zu einiger Erheiterung in der Lisp-Community geführt. Ganz besonders putzig daran: es gibt eine Lösung Tail-Calls per Dekorator optimieren zu lassen - in dem Python einfach im Stack rumfummelt (dank Stack-Introspection geht das ganz gut). Soviel zum Thema Rube Goldberg Device - der Dekorator ist extrem kompakt, da ist wirklich nicht viel Komplexität enthalten. Natürlich ist die Optimierung nicht wirklich optimal - sie vermeidet zwar den Stacküberlauf, aber benutzt Exception-Handling um die Funktionsaufrufe zu vermeiden, was dann doch etwas auf die Performance schlägt. Aber für die einfache Übertragung rekursiver Algorithmen kann das trotzdem durchaus nützlich sein.

Und warum wird sowas jetzt nicht als bessere, effizientere Lösung direkt in Python eingebaut? Python 2.5 kriegt von Perl geerbte bedingte Ausdrücke (value if condition else othervalue), aber sowas wie ein einfacher Dekorator zur Optimierung von bestimmten Funktionsaufrufen nicht?

tags: Programmierung, Python

Armin Ronacher Feb. 28, 2006, 9:06 p.m.

Hab ich schon seit einiger Zeit in den Pocoo utils dabei, in leicht modifizierter Version, aber mit dem gleichen Problem. Arschlangsam :-(

pocoo decoratory.py

hugo Feb. 28, 2006, 9:54 p.m.

Jo, wegen der Performance hätte ich sowas gerne im Standard mit drin, mit eventueller Unterstützung vom Sprach-Core. Genauso wie Continuations - oder wenigstens cloneable coroutines (Coroutinen kommen ja, aber ob die storabel/cloneable sein werden?).

Wenn du willst, du kannst gerne lazypy mit aufnehmen, das liefert Lazy Evluation für Python (wenn auch in eingeschränkter Form, da man die möglichen Returntypen angeben muss, aber besser als garnix). Und da du schon Memoziation hast, ich hab davon auch eine Variante die keinerlei Memoization macht - lazypy im Django-Projekt. :-)