29 Stimmen

Speichernutzung von Wörterbüchern in Python?

Ich bin etwas verwirrt, wenn ich die getsizeof Methode in der sys Modul für Wörterbücher. Im Folgenden habe ich ein einfaches Wörterbuch mit zwei Zeichenketten erstellt. Die Größe der beiden Strings ist deutlich größer als die des Wörterbuchs. Die Größe des Wörterbuchs ist wahrscheinlich nur der Overhead des Wörterbuchs, d.h. sie berücksichtigt nicht die eigentlichen Daten. Wie lässt sich der Speicherbedarf des gesamten Wörterbuchs (Schlüssel, Werte, Wörterbuch-Overhead) am besten ermitteln?

>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3021
>>> getsizeof(second)
3021
>>> getsizeof(my_dictionary)
140

17voto

Jacob Punkte 40193

Von der PythonDocs

Véase rekursives sizeof-Rezept für ein Beispiel zur rekursiven Verwendung von getsizeof(), um die Größe von Containern und deren Inhalt zu ermitteln.

Es wird also nur der Overhead gezählt, aber Sie können die Funktion in dieser Link um sie für Container wie Dicts zu berechnen.

9voto

Chris.Q Punkte 1310

Die rekursive getsizeof würde die tatsächliche Größe ermitteln, aber wenn Sie mehrere Ebenen von Wörterbüchern haben und nur eine grobe Schätzung erhalten möchten. Die json ist praktisch.

>>> first = 'abc'*1000
>>> second = 'def'*1000
>>> my_dictionary = {'first': first, 'second': second}
>>> getsizeof(first)
3049
>>> getsizeof(second)
3049
>>> getsizeof(my_dictionary)
288
>>> getsizeof(json.dumps(my_dictionary))
6076
>>> size = getsizeof(my_dictionary)
>>> size += sum(map(getsizeof, my_dictionary.values())) + sum(map(getsizeof, my_dictionary.keys()))
>>> size
6495

4voto

orlp Punkte 106335

Nun, Wörterbücher speichern nicht die eigentliche Zeichenfolge in ihnen, es funktioniert ein bisschen wie C/C++ Zeiger, so dass Sie nur eine konstante Overhead im Wörterbuch für jedes Element erhalten.

Die Gesamtgröße beträgt

size = getsizeof(d)
size += sum(map(getsizeof, d.itervalues())) + sum(map(getsizeof, d.iterkeys()))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X