vacia una tuplas sacar metodos llenar listas lista funciones elementos crear arreglos agregar python memory-management

una - metodos de listas en python



¿Cuántos bytes por elemento hay en una lista de Python(tupla)? (6)

Por ejemplo, ¿cuánta memoria se requiere para almacenar una lista de enteros de un millón (32 bits)?

alist = range(1000000) # or list(range(1000000)) in Python 3.0


"Depende." Python asigna espacio para las listas de forma que se consiga un tiempo constante amortizado para agregar elementos a la lista.

En la práctica, lo que esto significa con la implementación actual es ... la lista siempre tiene espacio asignado para una cantidad de elementos de potencia de dos. Entonces, el rango (1000000) realmente asignará una lista lo suficientemente grande como para contener 2 ^ 20 elementos (~ 1.045 millones).

Este es solo el espacio requerido para almacenar la estructura de la lista en sí (que es una matriz de punteros a los objetos de Python para cada elemento). Un sistema de 32 bits requerirá 4 bytes por elemento, un sistema de 64 bits usará 8 bytes por elemento.

Además, necesita espacio para almacenar los elementos reales. Esto varía ampliamente. Para enteros pequeños (de -5 a 256 actualmente), no se necesita espacio adicional, pero para números más grandes Python asigna un nuevo objeto para cada entero, que toma de 10 a 100 bytes y tiende a fragmentar la memoria.

En pocas palabras: es complicado y las listas de Python no son una buena forma de almacenar grandes estructuras de datos homogéneas. Para eso, use el módulo de array o, si necesita hacer cálculos vectorizados, use NumPy.

Las PS-Tuples, a diferencia de las listas, no están diseñadas para tener elementos que se añadan progresivamente a ellas. No sé cómo funciona el asignador, pero ni siquiera pienso en utilizarlo para estructuras de datos de gran tamaño :-)


Esto es específico de la implementación, estoy bastante seguro. Ciertamente, depende de la representación interna de los enteros: no se puede suponer que se almacenarán en 32 bits, ya que Python te proporciona enteros arbitrariamente grandes, por lo que quizás los pequeños enteros se almacenen de forma más compacta.

En mi Python (2.5.1 en Fedora 9 en core 2 duo), VmSize antes de la asignación es 6896kB, después es 22684kB. Después de una asignación de elemento de más de un millón, VmSize va a 38340kB. Esto indica groseramente alrededor de 16000kB para 1000000 enteros, que es alrededor de 16 bytes por entero. Eso sugiere una gran cantidad de gastos generales para la lista. Tomaría estos números con una gran pizca de sal.


Enlaces útiles:

Cómo obtener el tamaño / uso de la memoria del objeto python

Tamaños de memoria de objetos de pitón?

si coloca datos en el diccionario, ¿cómo calculamos el tamaño de los datos?

Sin embargo, no dan una respuesta definitiva. El camino a seguir:

  1. Mida la memoria consumida por el intérprete de Python con / sin la lista (use las herramientas del sistema operativo).

  2. Use un módulo de extensión de terceros que defina algún tipo de tamaño de (PyObject).

Actualización :

Receta 546530: tamaño de los objetos de Python (revisada)

import asizeof N = 1000000 print asizeof.asizeof(range(N)) / N # -> 20 (python 2.5, WinXP, 32-bit Linux) # -> 33 (64-bit Linux)


Dirigiéndose a "tupla" parte de la pregunta

La declaración de PyTuple de CPython en una configuración de construcción típica se reduce a esto:

struct PyTuple { size_t refcount; // tuple''s reference count typeobject *type; // tuple type object size_t n_items; // number of items in tuple PyObject *items[1]; // contains space for n_items elements };

El tamaño de la instancia de PyTuple se corrige durante su construcción y no se puede cambiar después. El número de bytes ocupados por PyTuple se puede calcular como

sizeof(size_t) x 2 + sizeof(void*) x (n_items + 1) .

Esto da un tamaño superficial de tupla. Para obtener el tamaño completo , también necesita agregar el número total de bytes consumidos por el gráfico de objetos enraizado en PyTuple::items[] array.

Vale la pena señalar que las rutinas de construcción de tuplas se aseguran de que solo se cree una sola instancia de tupla vacía (singleton).

Referencias: Python.h , object.h , tupleobject.h , tupleobject.c


Una nueva función, getsizeof() , toma un objeto Python y devuelve la cantidad de memoria utilizada por el objeto, medida en bytes. Los objetos incorporados devuelven resultados correctos; las extensiones de terceros no pueden, pero pueden definir un __sizeof__() para devolver el tamaño del objeto.

kveretennicov@nosignal:~/py/r26rc2$ ./python Python 2.6rc2 (r26rc2:66712, Sep 2 2008, 13:11:55) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 >>> import sys >>> sys.getsizeof(range(1000000)) 4000032 >>> sys.getsizeof(tuple(range(1000000))) 4000024

Los números devueltos obviamente no incluyen la memoria consumida por objetos contenidos (sys.getsizeof (1) == 12).


Soy cauteloso de por qué estás preguntando. ¿Estás tratando de calcular cuánta memoria necesitarás para una implementación determinada? Digamos que vas a leer 10,000,000 widgets y quieres saber cuánta RAM chupará.

Si ese es el caso, en lugar de tratar de calcular cuánta memoria RAM necesita cada widget, averigüe cuánta RAM, digamos, 10.000 widgets toma y multiplique para obtener su tamaño real.