2011-07-05 13 views
13

Estoy un poco confundido cuando uso el método getsizeof en el módulo sys para diccionarios. A continuación he creado un diccionario simple de dos cadenas. Los tamaños de las dos cuerdas son claramente más grandes que el del diccionario. El tamaño del diccionario es probablemente la sobrecarga del diccionario, es decir, no tiene en cuenta los datos reales. ¿Cuál es la mejor manera de descubrir el uso de memoria de todo el diccionario (claves, valores, sobrecarga del diccionario)?Uso de la memoria del diccionario en Python?

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

Respuesta

8

Desde el PythonDocs

Ver recursive sizeof recipe para un ejemplo del uso getsizeof() de forma recursiva para encontrar el tamaño de los recipientes y todo su contenido.

Por lo tanto, solo cuenta la sobrecarga, pero puede usar la función en this link para calcularla para contenedores como dicts.

3

Bueno, los diccionarios no almacene la cadena real dentro de ellos, funciona un poco como punteros de C/C++, lo que sólo recibe una sobrecarga constante en el diccionario para cada elemento.

El tamaño total es

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

Para ser pedantes, si alguno de los valores es un contenedor (en lugar de un escalar) necesita profundizar en ese contenedor también. –

3

El recursivo getsizeof obtendría el tamaño real, pero si tiene varias capas de diccionarios y solo desea obtener una estimación aproximada. El json es útil.

>>> 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 
+0

Definitivamente apunta a la creatividad, pero necesita que todo sea serializable, es más lento, y como dices es una aproximación ... – Mark

Cuestiones relacionadas