web-dev-qa-db-de.com

Besitzt Python einen Stack / Heap und wie wird der Speicher verwaltet?

Wie werden Variablen und Speicher in Python verwaltet? Hat es einen Stapel und einen Haufen und welcher Algorithmus wird zum Verwalten des Speichers verwendet? Gibt es angesichts dieses Wissens Empfehlungen zur Speicherverwaltung für das Knirschen großer Datenmengen?

77
Matt Alcock

Wie werden Variablen und Speicher in Python verwaltet?.

Automatisch! Nein, wirklich, Sie erstellen einfach ein Objekt und die Python Virtual Machine verwaltet den benötigten Speicher und wo er im Speicherlayout platziert werden soll.

Hat es einen Stapel und einen Haufen und welcher Algorithmus wird zum Verwalten des Speichers verwendet?

Wenn es sich um CPython handelt, wird ein privater Heap zum Speichern von Objekten verwendet. Aus der CPython C-API-Dokumentation :

Die Speicherverwaltung in Python beinhaltet einen privaten Heap, der alle Python Objekte und Datenstrukturen enthält. Die Verwaltung dieses privaten Heap wird intern durch die Python Speichermanager Der Python Speichermanager hat verschiedene Komponenten, die sich mit verschiedenen Aspekten der dynamischen Speicherverwaltung befassen, z. B. Freigabe, Segmentierung, Vorbelegung oder Zwischenspeicherung.

Die Speicherfreigabe erfolgt hauptsächlich durch Referenzzählung . Das heißt, das Python VM) führt ein internes Journal darüber, wie viele Referenzen auf ein Objekt verweisen, und sammelt es automatisch, wenn es keine Referenzen mehr gibt, auf die verwiesen wird Außerdem gibt es einen Mechanismus zum Aufbrechen von Zirkelverweisen (mit dem die Referenzzählung nicht umgehen kann), indem nicht erreichbare "Inseln" von Objekten erkannt werden etwas umgekehrt zu herkömmlichen GC-Algorithmen das versuchen, alle erreichbaren Objekte zu finden.

HINWEIS: Bitte beachten Sie, dass diese Informationen CPython spezifisch sind . Andere python Implementierungen wie pypy, iron python, jython und andere können sich voneinander und von CPython unterscheiden, wenn es um die Implementierungsspezifikationen geht. Um das besser zu verstehen, kann es hilfreich sein zu verstehen, dass es einen Unterschied zwischen Python der Semantik (der Sprache) und der zugrunde liegenden Implementierung gibt.

Gibt es angesichts dieses Wissens Empfehlungen zur Speicherverwaltung für das Knirschen großer Datenmengen?

Jetzt kann ich nicht darüber sprechen, aber ich bin mir sicher, dass NumPy (die beliebteste python Bibliothek zum Knacken von Zahlen) Mechanismen hat, die den Speicherverbrauch angemessen handhaben.

Wenn Sie mehr über Pythons Internals erfahren möchten, schauen Sie sich diese Ressourcen an:

98
NlightNFotis

Python hat so etwas nicht any.

Python ist die Sprache und gibt nicht an, wie genau Implementierungen die durch Python die Sprache definierte Semantik erreichen müssen.

Jede Implementierung (CPython, PyPy, IronPython, Stackless, Jython ...) ist frei, ihr eigenes Ding zu machen!

Im CPython, all Objekte leben auf dem Heap:

Die Speicherverwaltung in Python beinhaltet einen privaten Heap mit allen Python Objekten und Datenstrukturen.1

Die virtuelle CPython-Maschine ist stapelbasiert:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

Beachten Sie, dass dies CPython-spezifisch ist. Der Stapel enthält jedoch nicht die Werte actual, sondern enthält Verweise auf diese Objekte.

1: Quelle

43
phant0m