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

90

Wie werden Variablen und Speicher in Python verwaltet? Hat es einen Stapel und einen Heap und welcher Algorithmus wird zum Verwalten des Speichers verwendet? Gibt es angesichts dieses Wissens Empfehlungen zur Speicherverwaltung für die Verarbeitung großer Zahlen / Daten?

Matt Alcock
quelle
1
Vielleicht möchten Sie die folgenden beiden lesen: foobarnbaz.com/2012/07/08/understanding-python-variables docs.python.org/2/c-api/memory.html
user1690293
1
Gibt es ein spezifisches Problem mit der Python-Var / Speicherverwaltung, mit dem Sie ein Problem haben und das von der Python-Dokumentation und / oder dem Googeln nicht trivial entdeckt wird?
Martin James

Antworten:

111

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 Heap und welcher Algorithmus wird zum Verwalten des Speichers verwendet?

Wenn wir darüber sprechen CPython, wird ein privater Heap zum Speichern von Objekten verwendet. Aus der CPython C-API-Dokumentation :

Die Speicherverwaltung in Python umfasst einen privaten Heap, der alle Python-Objekte und Datenstrukturen enthält. Die Verwaltung dieses privaten Heaps wird intern vom Python-Speichermanager sichergestellt. Der Python-Speichermanager verfügt über verschiedene Komponenten, die sich mit verschiedenen Aspekten der dynamischen Speicherverwaltung befassen, z. B. Freigabe, Segmentierung, Vorbelegung oder Zwischenspeicherung.

Die Speicherrückgewinnung erfolgt meist durch Referenzzählung . Das heißt, die Python-VM führt ein internes Journal darüber, wie viele Referenzen auf ein Objekt verweisen, und sammelt es automatisch durch Müll, wenn keine Referenzen mehr darauf verweisen. Darüber hinaus gibt es einen Mechanismus zum Aufbrechen von Zirkelreferenzen (mit denen die Referenzzählung nicht umgehen kann), indem nicht erreichbare "Inseln" von Objekten erkannt werden, etwas im Gegensatz zu herkömmlichen GC-Algorithmen , die versuchen, alle erreichbaren Objekte zu finden.

HINWEIS: Bitte beachten Sie, dass diese InformationenCPythonspezifisch sind. Andere PythonImplementierungen, wiepypy,iron python,jythonund andere können voneinander und von CPython unterscheidenwenn es um deren Umsetzung Besonderheiten kommt. Um dies 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 die Verarbeitung großer Zahlen / Daten?

Jetzt kann ich nicht darüber sprechen, aber ich bin mir sicher, dass NumPy (die beliebteste Python-Bibliothek für das Knacken von Zahlen) über Mechanismen verfügt, die den Speicherverbrauch angemessen handhaben.

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

NlightNFotis
quelle
5
Gut, dass Sie die Unterscheidung zwischen Python und CPython
betonen
1
Beachten Sie, dass bei lokalen Variablen die tatsächlichen Variablen im Äquivalent eines Stapelrahmens gespeichert werden.
Marcin
1
Python ist nicht Java; Es gibt keine virtuelle Maschine. es hat einen Dolmetscher. Es mag pedantisch erscheinen, darauf hinzuweisen, aber es handelt sich um zwei verschiedene Paradigmen, und der Unterschied hat wichtige Auswirkungen darauf, wie Code kompiliert und ausgeführt wird. stackoverflow.com/questions/441824/…
Apollo2020
48

Python hat keine solche Sache.

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

Jede Implementierung (CPython, PyPy, IronPython, Stackless , Jython ...) kann ihre eigene Sache machen!

In C Python befinden sich alle Objekte auf dem Heap:

Die Speicherverwaltung in Python umfasst einen privaten Heap, der alle Python-Objekte und Datenstrukturen enthält. 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 tatsächlichen Werte, sondern enthält Verweise auf diese Objekte.

1 : Quelle

phant0m
quelle