Was ist der Unterschied zwischen den Methoden len () und sys.getsizeof () in Python?

9

Wenn ich den untenstehenden Code ausgeführt habe, habe ich 3 bzw. 36 als Antworten erhalten.

%Vor%

Kann mir jemand erklären, was der Unterschied zwischen ihnen ist?

    
Balamurugan 10.07.2013, 15:00
quelle

1 Antwort

35

Sie sind überhaupt nicht das Gleiche .

len() fragt nach der Anzahl der in einem Container enthaltenen Elemente ab. Für eine Zeichenfolge, die die Anzahl der Zeichen ist:

  

Gibt die Länge (die Anzahl der Elemente) eines Objekts zurück. Das Argument kann eine Sequenz (String, Tupel oder Liste) oder ein Mapping (Dictionary) sein.

sys.getsizeof() gibt andererseits die Speichergröße des Objekts:

  

Gibt die Größe eines Objekts in Byte zurück. Das Objekt kann ein beliebiger Objekttyp sein. Alle integrierten Objekte geben korrekte Ergebnisse zurück, dies muss jedoch nicht für Erweiterungen von Drittanbietern gelten, da es implementierungsspezifisch ist.

Python-String-Objekte sind keine einfachen Zeichenfolgen, 1 Byte pro Zeichen.

Insbesondere enthält die Funktion sys.getsizeof() den Garbage Collector-Overhead, falls vorhanden:

  

getsizeof() ruft die __sizeof__ -Methode des Objekts auf und fügt einen zusätzlichen Garbage Collector-Overhead hinzu, wenn das Objekt vom Garbage Collector verwaltet wird.

String-Objekte müssen nicht nachverfolgt werden (sie können keine zirkulären Referenzen erstellen), aber String-Objekte benötigen mehr Speicher als nur die Bytes pro Zeichen. In Python 2 gibt die Methode __sizeof__ (in C-Code):

zurück %Vor%

Dabei ist PyStringObject_SIZE die C-Struktur-Headergröße für den Typ, PyString_GET_SIZE ist im Grunde gleich wie len() und Py_TYPE(v)->tp_itemsize ist die pro-Zeichen-Größe. In Python 2.7, für Byte-Strings, ist die Größe pro Zeichen 1, aber es ist PyStringObject_SIZE , das dich verwirrt; Auf meinem Mac ist diese Größe 37 Bytes:

%Vor%

Für unicode strings erhöht sich die Größe pro Zeichen auf 2 oder 4 (abhängig von den Kompilierungsoptionen). In Python 3.3 und höher belegen Unicode-Strings je nach dem Inhalt der Zeichenfolge zwischen 1 und 4 Byte pro Zeichen.

    
Martijn Pieters 10.07.2013, 15:01
quelle

Tags und Links