jens hat geschrieben:Wie setzt Python denn bei diesem Mixin-Ansatz den "Runtime-Code" zusammen?!? Landen alle Attribute/Methoden im __dict__ so das es im Prinzip keinen Performance Unterschied geben wird?
Das ist ein MRO-Problem, dafür gibts ein paar Artikel, wie Python das umsetzt. Welche Laufzeitimplikationen das für verschiedene Python-Inkarnationen hat, kann ich Dir nicht sagen. Jenseits der Implementationsdetails sollte MRO-Verhalten allerdings bei allen gleich sein, da man keine Überraschungen bei Mehrfachvererbung zwischen CPython, Jython, PyPy etc. sehen möchte.
Generell zu Optimierungen:
- Kurzer Quelltext ist meist auch schneller, weil Quelltextlänge oft mit Anzahl der auszuwertenden Instruktionen korreliert (vorausgesetzt man produziert nicht seitenweise dead code oder Monsterbranches).
- Komplexe Typen vs. simple Typen - einfache Typen sind idR schneller. Das kommt aber mit einem tradeoff - idR ist die Funktionalität nicht 1:1 abbildbar und man braucht Zusatzcode (Bloatware), um die Funktionalität zu erhalten. Das geht dann schnell zu Lasten der Lesbarkeit bzw. kann der Zusatzcode sehr viel schlechter sein als der Librarycode, was dann eher alles schlimmer macht. Bei CPython kommt noch der Unterschied zwischen internen Typen (in C geschrieben) vs. selbst definierten hinzu. Eine clever gestrickte Liste mit Integern könnte evtl. das Gleiche leisten, wie eine selbst definierte Klasse usw. Ob man dagegen optimieren will - wohl eher nicht, da dass dann doch zu implementationsspezifisch sein dürfte.
- lokal vs. objektweit - Hmm, in C naher Programmierung macht das definitv was aus allein schon aufgrund der Heap/Stack-Unterschiede. Je nach Umsetzung/Durchreichung können in C/C++ geschriebene Interpreter auch in der interpretierten Sprache davon profitieren (z.B. zeigen alle JS-Interpreter/Jits dieses Verhalten). Zusätzlich brauchen objektweite Attribute einen weiteren Dereferenzierungsschritt beim Auflösen des Namens - mehr Arbeit für den Rechner. Ob Du hier etwas gewinnen kannst - schwer zu sagen, dafür bräuchtest Du ein genaues Profiling.
Generell würde ich mittels profiling schauen, ob es Flaschenhälse gibt, welche mit Mitteln der Sprache behebbar sind. Wenn dann die Performance noch nicht reichen sollte - Plan B für Funktionalität XY....