2009-11-05 122 views
8

Necesito una lista muy grande, y estoy tratando de descubrir qué tan grande puedo hacerlo para que aún me quede en 1-2GB de RAM. Estoy usando la implementación CPython, en 64 bits (x86_64).Python: ¿Cuánto espacio ocupa cada elemento de una lista?

Editar: gracias a la respuesta de bua, he completado algunas de las respuestas más concretas.

¿Cuál es el uso del espacio (memoria) de (en bytes):

  • la propia lista
    • sys.getsizeof([]) == 72
  • cada entrada de la lista (sin incluir los datos)
    • sys.getsizeof([0, 1, 2, 3]) == 104, por lo que 8 bytes en cabeza por entrada.
  • los datos si es un número entero
    • sys.getsizeof(2**62) == 24 (pero varía según el tamaño de número entero)
    • sys.getsizeof(2**63) == 40
    • sys.getsizeof(2**128) == 48
    • sys.getsizeof(2**256) == 66
  • los datos si es un objeto (sizeof(Pyobject) supongo))
    • sys.getsizeof(C()) == 72 (C es un objeto del espacio de usuario vacío)

Si puede compartir los datos más generales sobre los tamaños observados, que sería grande. Por ejemplo:

  • ¿Existen casos especiales (creo que los valores inmutables podrían ser compartidas, así que tal vez una lista de Bools no toma ningún espacio adicional para los datos)?
  • Quizás las listas pequeñas tengan una sobrecarga de X bytes, pero las listas grandes tienen una sobrecarga de bytes Y?
+0

es posible que desee responder su propia pregunta con la información que ha agregado, sin embargo, es bastante obvio que bua ha respondido la parte principal de su pregunta, y EOL ha proporcionado una manera de predecir con mayor precisión y ajustar más elementos en la memoria RAM. –

+0

Esto fue publicado como una respuesta que tuvo que ser eliminada como una respuesta de enlace único, pero parece que podría ser útil, así que lo estoy publicando como un comentario. El Módulo Python de la semana publicó un artículo sobre Python Memory Management, que puede ver aquí: http://pymotw.com/2/sys/limits.html – ArtOfWarfare

Respuesta

9

punto de inicio:

>>> import sys 
>>> a=list() 
>>> type(a) 
<type 'list'> 
>>> sys.getsizeof(a) 
36 
>>> b=1 
>>> type(b) 
<type 'int'> 
>>> sys.getsizeof(b) 
12 

y desde pitón ayuda:

>>> help(sys.getsizeof) 
Help on built-in function getsizeof in module sys: 

getsizeof(...) 
    getsizeof(object, default) -> int 

    Return the size of object in bytes. 
6

Si desea una lista de valores numéricos, el módulo estándar array proporciona matrices optimizadas (que tienen un método append)

El módulo NumPy no estándar pero de uso común le ofrece arreglos eficientes de tamaño fijo.

+1

+1, para el módulo de matriz –

Cuestiones relacionadas