HOWTO · Python

Bestimmen Sie die Größe eines Objekts in Python

In diesem Tutorial wird erläutert, wie Sie die Größe eines Objekts in Python bestimmen.

Auf dieser Seite

Mit sys.getsizeof() lässt sich die flache Größe eines Objekts in Byte ermitteln. Die Methode addiert nicht die Größen der Objekte, auf die dieses Objekt verweist. Für eine rekursive Schätzung eines Containers samt Inhalt eignet sich Pympler; um Python-Speicherbelegungen im Zeitverlauf zu vergleichen, verwenden Sie tracemalloc.

Mit sys.getsizeof() die flache Größe eines Objekts messen

Importieren Sie sys und übergeben Sie den zu untersuchenden Wert an sys.getsizeof(). Die zurückgegebene Ganzzahl gibt die flache Größe des Objekts in Byte an. Bei einer Liste wird zum Beispiel das Listenobjekt selbst erfasst, nicht aber die darin enthaltenen Objekte. Dieser Unterschied ist wichtig, wenn ein Container auf große Zeichenketten, verschachtelte Container oder andere Daten verweist.

Führen Sie dieses Beispiel aus, um einen eingebauten Container zu messen. Der ausgegebene Bytewert ist ein beispielhafter Messwert aus einer Umgebung. Er hängt von der Python-Implementierung und -Version ab und ist kein allgemein gültiger Festwert. Die Beschriftung in der unveränderten Beispielausgabe bleibt englisch:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import sys

values = [10, 20, 30]
size_bytes = sys.getsizeof(values)
print(f"Shallow size: {size_bytes} bytes")
Shallow size: 88 bytes

Andere Werte wie eine Zeichenkette, eine Ganzzahl oder ein Wörterbuch können Sie auf dieselbe Weise übergeben. Auch die dafür gemeldeten Größen können je nach Python-Implementierung und -Version abweichen. Betrachten Sie das Ergebnis als Messwert auf Implementierungsebene, nicht als Aussage über den gesamten Speicherbedarf des Prozesses oder die Kosten aller Objekte, die vom Wert aus erreichbar sind.

Mit Pympler referenzierte Objekte einbeziehen

Wenn Sie eine Schätzung benötigen, die auch über einen Container erreichbare Objekte umfasst, kann Pymplers Hilfsfunktion asizeof referenzierte Objekte rekursiv berücksichtigen. Installieren Sie das Drittanbieterpaket mit pip install pympler, importieren Sie anschließend asizeof aus pympler und rufen Sie die Funktion mit dem zu untersuchenden Wert auf.

Führen Sie dieses eigenständige Beispiel nach der Installation von Pympler aus. Die Beschriftungen einer unveränderten Beispielausgabe bleiben englisch:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

try:
    from pympler import asizeof
except ImportError:
    print("Install Pympler with: pip install pympler")
else:
    values = [1, 2, [3, 4]]
    print(f"Recursive size: {asizeof.asizeof(values)} bytes")

Die angegebene Zahl hängt von der Python-Implementierung, der Python-Version und der installierten Pympler-Version ab. Betrachten Sie sie daher als Schätzung für diesen Objektgraphen und nicht als allgemein gültigen Festwert.

Diese rekursive Schätzung beantwortet eine andere Frage als sys.getsizeof(): Sie bezieht verschachtelte Objekte ein und nicht nur die flache Größe des äußeren Objekts. Dennoch handelt es sich um eine Schätzung des Objektgraphen, nicht um eine Messung des gesamten Python-Prozesses, des Speicherverwaltungs-Overheads oder des residenten Speichers, den das Betriebssystem meldet. Gemeinsame Referenzen und Implementierungsdetails können beeinflussen, wie ein rekursives Werkzeug Objekte berücksichtigt. Verwenden Sie es daher für konsistente Vergleiche von Strukturen und nicht als exakten Gesamtwert für den Prozessspeicher.

Speicherbelegungen mit tracemalloc nachverfolgen

Verwenden Sie das Standardbibliotheksmodul tracemalloc, wenn Sie Python-Speicherbelegungen während eines Programmabschnitts beobachten möchten. Starten Sie die Aufzeichnung vor der interessierenden Arbeit, lesen Sie die aktuellen und maximalen aufgezeichneten Größen in Byte aus und beenden Sie die Aufzeichnung anschließend. Das folgende eigenständige Beispiel legt während der Aufzeichnung eine Liste an und gibt beide Messwerte aus. Die angezeigten Zahlen sind beispielhafte Werte aus einer Umgebung und variieren je nach Python-Implementierung und Laufzeitumgebung. Beschriftungen in der unveränderten Beispielausgabe bleiben englisch:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import tracemalloc

tracemalloc.start()
values = [number for number in range(1000)]
current_bytes, peak_bytes = tracemalloc.get_traced_memory()
print(f"Current traced memory: {current_bytes} bytes")
print(f"Peak traced memory: {peak_bytes} bytes")
tracemalloc.stop()
Current traced memory: 29536 bytes
Peak traced memory: 29536 bytes

current_bytes bezeichnet die aktuell aufgezeichnete Menge, während peak_bytes den höchsten Wert seit Beginn der Aufzeichnung angibt. Damit eine Speicherbelegung erfasst wird, muss die Aufzeichnung bereits vor der betreffenden Zuweisung aktiv sein. Die Messwerte beziehen sich auf aufgezeichnete Python-Speicherbelegungen und nicht auf die rekursive Größe eines ausgewählten Objekts. Verwenden Sie Snapshots oder vergleichen Sie Messwerte an aussagekräftigen Stellen, wenn Sie untersuchen möchten, wo Speicher belegt wird. Beenden Sie die Aufzeichnung nach der Messung, damit nicht unnötig weiter Daten gesammelt werden.