HOWTO · Python
Determinar el tamaño de un objeto en Python
Este tutorial analiza cómo determinar el tamaño de un objeto en Python.
En esta página
Usa sys.getsizeof() para obtener el tamaño superficial de un objeto en bytes. No suma los tamaños de los objetos a los que este hace referencia. Para obtener una estimación recursiva de un contenedor y su contenido, usa Pympler; para comparar las asignaciones de Python a lo largo del tiempo, usa tracemalloc.
Usa sys.getsizeof() para medir el tamaño superficial de un objeto
Importa sys y pasa a sys.getsizeof() el valor que quieras inspeccionar. El entero devuelto indica el tamaño superficial del objeto en bytes. Por ejemplo, cuenta el objeto lista en sí, pero no los objetos que contiene. Esta distinción es importante cuando un contenedor hace referencia a cadenas grandes, otros contenedores anidados u otros datos.
Ejecuta este ejemplo para medir un contenedor integrado. La cantidad de bytes que se muestra es una lectura ilustrativa de un entorno; depende de la implementación y la versión de Python, y no es un valor fijo que pueda aplicarse a todos los casos:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import sys
values = [10, 20, 30]
size_bytes = sys.getsizeof(values)
print(f"Shallow size: {size_bytes} bytes")
Shallow size: 88 bytes
Puedes pasar otros valores de la misma forma, como una cadena, un entero o un diccionario. Los tamaños indicados también pueden variar según la implementación y la versión de Python. Considera el resultado una medición propia de la implementación, no una garantía sobre la memoria total del proceso ni sobre el costo de todos los objetos accesibles desde ese valor.
Incluye los objetos referenciados con Pympler
Si necesitas una estimación que incluya los objetos a los que se puede acceder a través de un contenedor, la utilidad asizeof de Pympler puede contabilizarlos de forma recursiva. Instala el paquete de terceros con pip install pympler; luego importa asizeof desde pympler y llámalo con el valor que quieras inspeccionar.
Ejecuta este ejemplo independiente después de instalar Pympler:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
try:
from pympler import asizeof
except ImportError:
print("Install Pympler with: pip install pympler")
else:
values = [1, 2, [3, 4]]
print(f"Recursive size: {asizeof.asizeof(values)} bytes")
La cifra depende de la implementación y la versión de Python, así como de la versión instalada de Pympler. Tómala como una estimación de este grafo de objetos, no como un valor fijo aplicable a todos los casos.
Esta estimación recursiva responde a una pregunta distinta de la de sys.getsizeof(): incluye los objetos anidados, en vez de medir solo el tamaño superficial del objeto externo. Sigue siendo una estimación del grafo de objetos, no una medición de todo el proceso de Python, de la sobrecarga del asignador ni de la memoria residente que informa el sistema operativo. Las referencias compartidas y los detalles de implementación pueden afectar la forma en que una herramienta recursiva contabiliza los objetos, así que úsala para comparar estructuras de manera coherente, no como un total exacto de la memoria del proceso.
Rastrea las asignaciones de memoria con tracemalloc
Usa el módulo de la biblioteca estándar tracemalloc cuando quieras observar las asignaciones de memoria de Python durante una parte del programa. Inicia el rastreo antes del trabajo que te interesa, consulta los tamaños actuales y máximos rastreados en bytes y, al terminar, detén el rastreo. El siguiente ejemplo independiente asigna una lista mientras el rastreo está activo e informa de ambas lecturas; las cifras mostradas son lecturas ilustrativas de un entorno y varían según la implementación de Python y el entorno de ejecución.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import tracemalloc
tracemalloc.start()
values = [number for number in range(1000)]
current_bytes, peak_bytes = tracemalloc.get_traced_memory()
print(f"Current traced memory: {current_bytes} bytes")
print(f"Peak traced memory: {peak_bytes} bytes")
tracemalloc.stop()
Current traced memory: 29536 bytes
Peak traced memory: 29536 bytes
current_bytes es la cantidad que se está rastreando en ese momento, mientras que peak_bytes es la cantidad rastreada más alta desde que comenzó el rastreo. El rastreo debe estar activo antes de una asignación para registrarla, y las lecturas abarcan las asignaciones de Python rastreadas, no el tamaño recursivo retenido por un objeto concreto. Para investigar dónde se producen las asignaciones, usa instantáneas o compara las lecturas en momentos relevantes. Cuando termines de medir, detén el rastreo para que no siga recopilando datos innecesariamente.