[Python-de] Speicher Management Frage

Georg Mischler schorsch at schorsch.com
Mon Mar 4 12:33:43 EST 2002


Mark Zoeltsch wrote:

> Hallo alle miteinander!
>
> Wollte mich gleich mal mit einer Frage in dieser ML vorstellen :)
>
> Ich beschaeftige mich seit kurzem erst mit python (so einen Monat
> ungefaehr), daher die Frage wo landet was wann auf welchem
> Speicher? Wenn ich das richtig verstanden hab ist alles in python 2.2
> ein objekt (oder gibts da noch Ausnahmen?) und laut der Beschreibung
> auf python.org wird damit alles mit malloc/realloc auf den Heap eingerichtet.
> Also auch globle Variablen? Die Frage kommt nicht von ungefaehr,
> denn mit time.clock() hab ich mal ein paar Messungen gemacht und
> gemerkt das Operationen innerhalb von Funktionen (also lokale Variablen)
> wesentlich schneller ablaufen, als ihre Gegenstuecke mit globalen Variablen.


Die Objekte werden bei Python schon immer auf dem Heap alloziert.
Was sich seit 2.x geaendert hat ist lediglich die semantische
Bedeutung der verschiedenen Objekttypen, d.h. das Objektmodell
wurde vereinheitlicht.

Das hat aber alles nichts mit deiner Beobachtung zu tun.
Die Laufzeitunterschiede werden nicht durch die Speichermethode,
sondern durch den jeweiligen Zugriffsweg verursacht. Wenn du auf
eine Variable zugreifst, dann verursachst du damit einen
mehrstufigen Prozess. Zuerst wird im Namensraum der aktuellen
Funktion nachgeschaut (technisch ein Dictionary). Wenn dort keine
Variable mit passendem Namen gefunden wird, dann kommt der
Namensraum des Moduls dran, in dem sich die Funktion befindet.
Zuletzt wird im globalen Namensraum des Interpreters nachgeschaut.

Der Aufwand, um den Wert einer Variable festzustellen, steigt
also deutlich, je weiter entfernt vom momentanen Ort des
Geschehens diese definiert ist. Zusaetzlich hat der Interpreter
noch besondere Tricks, um Zugriffe innerhalb einer Funktion zu
optimieren (dynamische Veraenderungen sind dort leichter zu
ueberwachen). Die Tempodifferenzen haben also weniger mit der
low-level Implementation auf C-Ebene zu tun, als einfach mit den
dynamischen Eigenschaften der Sprache.

Es wird deshalb auch empfohlen, auch bei einfachsten Scripts die
Funktionalitaet grundsaetzlich in eine Funktion zu kapseln, und
nicht einfach alles auf Modulebene auszubreiten. Und wenn du
innerhalb einer Funktion wiederholt auf eine globale Variable
zugreifen willst, dann kann es sich relativ bald lohnen, mal eben
eine lokale Kopie davon anzulegen. Wenn deren Wert ein
veraenderbares Objekt ist, dann brauchst du das Resultat danach
haeufig noch nicht einmal mehr explizit zurueckzuschreiben.


Viel Spass!

-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch.com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/




More information about the Python-de mailing list