Python >> Python Tutorial >  >> Python

Speicherverwaltung in Python

Speicherverwaltung ist der Prozess, Speicher dynamisch zu speichern und ihn freizugeben, wenn er nicht verwendet wird.


Speicherverwaltung in Python verstehen

In Python erfolgt diese Zuweisung und Freigabe von Speicher automatisch durch den von Python-Entwicklern erstellten Python-Garbage Collector, sodass Benutzer keine manuelle Garbage Collection durchführen müssen.

Müllabfuhr

Garbage Collection in Python ist der Speicherverwaltungsprozess, bei dem ungenutzter und unerwünschter Speicher für unsere Programme durch den Interpreter freigegeben wird. In Python geschieht dies automatisch.

Der Garbage Collector findet das Objekt, auf das keine Referenz zeigt, und löscht dann dieses Objekt aus dem Heap-Speicher. Dafür verwendet Python einen Referenzzählalgorithmus.

Beispiel:

class Python:

    def __init__(self):
        print('The object is created.')

    def __del__(self):
        print('The object is destroyed.')

obj1 = Python()
obj2 = obj1
obj3 = obj1
print("Set obj1 to None")
obj1 = None
print("Set obj2 to None")
obj2 = None
print("Set obj3 to None")
obj3 = None

Ausgabe:

The object is created.
Set obj1 to None
Set obj2 to None
Set obj3 to None
The object is destroyed.

Hier haben wir ein Objekt der Klasse Python erstellt und hat seine Referenz an obj1, obj2, obj3 übergeben . Dies macht den Referenzzähler dieses Objekts zu 3. Wenn wir dann diese Referenzen none zuweisen , werden alle Verweise von diesem Objekt entfernt und werden zu 0. Da es keine Verweise auf das Objekt gibt, wird es vom Python-Garbage Collector zerstört und die Methode __del__() wird ausgeführt.

Referenzzählung

Das Referenzzählen in Python ist eine Technik, bei der ein Objekt aus dem Speicher freigegeben wird, wenn keine Referenzen darauf verweisen. Wenn der Referenzzähler Null wird, wird das Objekt gelöscht.

Wir haben eine eingebaute Funktiongetrefcount() im Python-Modul sys vorhanden die die Anzahl der Referenzen für das angegebene Python-Objekt zurückgibt.

Beispiel:

import sys
str = "Welcome to Python"
print(sys.getrefcount(str))

arr = []
arr.append(str) # appending to an array
print(sys.getrefcount(str))

dict = {}
dict['str'] = str # adding to a dictionary
print(sys.getrefcount(str))

arr = [] # resetting the array
sys.getrefcount(str)
dict['my_str'] = "Some other string"
print(sys.getrefcount(str))
 

Ausgabe:

4
5
6
5

Der Wert des Referenzzählers ist um eins höher als erwartet, da er auch den Referenzzähler für das Objekt zählt, das in der Funktion sys.getrefcount() übergeben wird.

Manchmal erreicht der Referenzzähler eines Objekts nie Null. Dies geschieht, weil das Objekt auf sich selbst verweist. Dies wird als Referenzzyklus bezeichnet .

Beispiel:

import sys
x = []
x.append(x) # x contains reference to itself
print("Reference count of object is",sys.getrefcount(x))

Ausgabe:

Reference count of object is 3

Hier wird ein Objekt x erzeugt, das auf sich selbst verweist. Der Referenzzähler wird nie 0 erreichen, da er seine eigene Referenz hat. Das Objekt x belegt den Speicher, bis der Python-Garbage Collector aufgerufen wird.

Wenn ein Objekt global deklariert wird, kann der Referenzzähler eines Objekts niemals Null werden.

Speicherzuordnung

Um die Speicherzuweisung zu verstehen, müssen wir Random Access Memory (RAM) verstehen. RAM wird auch als Hauptspeicher bezeichnet, der das Speichern und Abrufen von Informationen auf einem Computer ermöglicht.

Oben im RAM haben wir einen Stapel und unten haben wir einen Haufen. Heap ist verantwortlich für das Speichern von Variablen/Werten und Stack ist dafür verantwortlich, die Referenzen auf das Objekt im Heap zu halten.

Wenn in Python mehr als eine Variable denselben Wert hat, wird im Heap eine zweite Variable erstellt, die auf den ursprünglichen Wert zeigt.

Beispiel:

x = 5
y = x 
if(id(x) == id(y)):
   print("x and y refer to the same object")

x = x+1
if(id(x) != id(y)):
    print("x and y refer to different objects")

z = 5
if(id(y) == id(y)):
   print("y and z refer to same memory")

Ausgabe:

x and y refer to the same object
x and y refer to different objects
y and z refer to same memory

Es gibt zwei Arten von Speicherzuweisungen:

  • Stack-Speicherzuweisung
  • Heap-Speicherzuweisung.

1. Stack-Speicherzuweisung

Die Stapelspeicherzuordnung ist die Speicherung von statischem Speicher innerhalb einer bestimmten Funktion oder eines bestimmten Methodenaufrufs. Wenn die Funktion aufgerufen wird, wird der Speicher im Funktionsaufrufstapel gespeichert. Alle lokalen Variableninitialisierungen werden im Aufrufstapel gespeichert und gelöscht, sobald die Funktion zurückkehrt.

Wenn wir also unser Programm ausführen, werden alle Funktionen zuerst im Aufrufstapel gespeichert und dann gelöscht, wenn die Funktion zurückgegeben wird.

Beispiel:

def func():
    #These initializations are stored in stack memory
    x = 10 
    y = "Apple"
     

2. Heap-Speicherzuweisung

Heap-Speicherzuweisung ist die Speicherung von Speicher, der außerhalb einer bestimmten Funktion oder eines Methodenaufrufs benötigt wird. Dieser Speicher wird im Programm global verwendet.

Der Heap-Speicher ist nicht mit der Heap-Datenstruktur verbunden. Es ist einfach ein großer Speicherplatz, der Benutzern zur Verfügung gestellt wird, wenn sie Variablen/Werte zuweisen und freigeben möchten.

In Python wird der Heap-Speicher vom Interpreter selbst verwaltet und der Benutzer hat keine Kontrolle darüber.

Beispiel:

def func()
    #Allocates memory for 5 integers in heap memory
    x=[None]*5

Schlussfolgerung

Programmierer verliebten sich in Python wegen seiner überlegenen Speicherverwaltungsfunktionen. Im Vergleich zu vielen anderen Low-Level-Programmiersprachen ist es mit Python ein Kinderspiel, mit Variablen zu arbeiten, ohne sich Gedanken über die Überbeanspruchung von Ressourcen machen zu müssen.


Referenzen

Offizielle Dokumente