2012-02-25 19 views
13

considere el siguiente código:Python: tamaño de las cadenas en la memoria

arr = [] 
for (str, id, flag) in some_data: 
    arr.append((str, id, flag)) 

imaginar las cadenas de entrada Siendo 2 caracteres de largo en promedio y 5 caracteres max y some_data que tiene 1 millón de elementos. ¿Cuál será el requisito de memoria de dicha estructura?

¿Puede ser que se desperdicie mucha memoria para las cuerdas? Si es así, ¿cómo puedo evitar eso?

Respuesta

20

En este caso, debido a que las cadenas son bastante cortas, y hay tantas, puede guardar un poco de memoria usando intern en las cadenas. Suponiendo que solo hay letras minúsculas en las cuerdas, son 26 * 26 = 676 posibles cuerdas, por lo que debe haber muchas repeticiones en esta lista; intern se asegurará de que esas repeticiones no den como resultado objetos únicos, sino que todas se refieran al mismo objeto base.

Es posible que Python ya sea interno de cuerdas cortas; pero mirando varias fuentes diferentes, parece que esto depende mucho de la implementación. Entonces, llamar al intern en este caso es probablemente el camino a seguir; YMMV.

como una elaboración sobre por qué esto es muy probable que ahorrar memoria, tenga en cuenta lo siguiente:

>>> sys.getsizeof('') 
40 
>>> sys.getsizeof('a') 
41 
>>> sys.getsizeof('ab') 
42 
>>> sys.getsizeof('abc') 
43 

agregar caracteres individuales de una cadena añade solamente un byte en el tamaño de la propia cadena, pero cada string ocupa 40 bytes por sí mismo.

+0

Ahora aprendí que python, en general, consume bastante memoria. Como señala correctamente, la longitud de las cadenas no es el problema aquí, sino el tamaño mínimo de los objetos. Me sorprendió un poco descubrir también que el tamaño de un int simple es de 24 bytes (en el sistema de 64 bits). Es bueno saber ... –

0

Si sus cadenas son tan cortas, es probable que haya una cantidad significativa de duplicados. El internamiento de Python lo optimizará para que estas cadenas se almacenen solo una vez y la referencia use varios tiems, en lugar de almacenar la cadena varias veces ...

Estas cadenas se deben internar automáticamente como las hay.

+0

Los literales de cadena están internados, pero las cadenas creadas a partir de otras fuentes no son necesariamente interpretadas. No querría una llamada 'interno' cada vez que lea algo de un archivo ... – delnan

Cuestiones relacionadas