• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Estadística
      • Calculadora del Tamaño Muestral en Encuestas
      • Calculadora de estadísticos descriptivos
      • Test de normalidad
      • Calculadora de contrastes de hipotesis
      • Calculadora de tamano del efecto
      • Simulador de Regresión Lineal con Ruido
      • Visualizador de PCA
      • Visualizador de Series Temporales
      • Simulador de Regresión Logística
      • Simulador de K-Means
      • Simulador de DBSCAN
      • Detector de la Ley de Benford
    • Probabilidad
      • Calculadora de Probabilidad de Distribuciones
      • Calculadora de Probabilidades de Lotería
      • Simulador del Problema de Monty Hall
      • Simulador de la Estrategia Martingala
    • Finanzas
      • Calculadora de Préstamos e Hipotecas
      • Conversor TIN ↔ TAE
      • Calculadora DCA con ajuste por inflación
      • Calculadora XIRR con Flujos Irregulares
      • Simulador FIRE (Financial Independence, Retire Early)
    • Riesgo
      • Constructor de Scorecards de Crédito
      • Aplicar Scorecard de Crédito
    • Herramientas
      • Formateador / Minificador de JSON
      • Conversor CSV ↔ JSON
      • Comparador y Formateador de Texto y JSON
      • Formateador y Tester de Expresiones Regulares
      • Inspector de JWT
      • Generador y verificador de hashes
      • Codificador / Decodificador Base64 y URL
      • Conversor de bases numericas
      • Conversor de Timestamp Unix
      • Conversor de colores
      • Generador de UUIDs
    • Juegos
      • Tres en Raya
      • Nim con Q-Learning
    • Más
      • Método D’Hondt
      • Generador de Contraseñas Seguras
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

Medir y reducir el consumo de memoria en Python

noviembre 19, 2018 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 4 minutos

La disponible memoria en los sistemas informáticos es un recurso limitado. En la implementación de un algoritmo esto se ha de tener en cuenta. Reducir el consumo de la memoria es clave para permitir que el programa se ejecute en sistemas con menos recursos. Además de mejorar el rendimiento en sistemas con más recursos. Para reducir el consumo de memoria en Python es necesario primero medir el primero cuanta memoria ocupa un objeto. Una vez se conocido el dato será posible reducir el tamaño de los programas.

Medir la memoria ocupado por un objeto en Python

Obtener la memoria de un objeto en Python es una tarea algo más complicado de se podría pensar. La primera idea sería utilizar la función getsizeof() que se puede encontrar en la librería sys. Esta función devuelve el tamaño en bytes del objeto que se le hubiese pasado. A modo de ejemplo se puede ver el siguiente código la memoria que requieren diferentes tipos de objetos.

import sys

print(sys.getsizeof(1.0))                  # 24
print(sys.getsizeof(""))                   # 49
print(sys.getsizeof("Hello!"))             # 55
print(sys.getsizeof(dict()))               # 240
print(sys.getsizeof(dict({'A':1, 'B':2}))) # 240

Al ejecutar el código se puede ver que un valor real ocupa 24 bytes, una cadena vacía 49 y la cadena Hello! ocupa 55 bytes. Esto significa que en una cadena cada carácter ocupa un byte. Lo que no parece normal es lo que se observa con los diccionarios. Un diccionario vacío y uno con datos ocupa exactamente lo mismo 240 bytes. Esto es así porque getsizeof() solo tiene en cuenta la memoria del objeto Python y no los objetos a los que hace referencia. Es decir, la función solamente devuelve la memoria ocupada por la escritura, no su contenido. Por lo que solamente es útil para medir la memoria ocupada por los objetos primitivos. En los objetos no primitivos será necesario utilizar algún tipo de función recursiva. Incluso para los tipos contenedores incluidos en el sistema como listas o diccionarios.

Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane
En Analytics Lane
Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane

Medir la memoria total ocupada por un objeto en Python

La única forma de obtener la memoria total de un objeto en Python es utilizar un método recursivo. Este método ha de recorrer el objeto y sumar la memoria que ocupa cada uno de los objetos que forma parte del primero. La implementación de una función que permita obtener la memoria de un objeto se puede encontrar en la publicación “Measure the Real Size of Any Python Object”. La función que se implementa en la entrada es:

def get_size(obj, seen=None):
    """Recursively finds size of objects"""
    size = sys.getsizeof(obj)
    if seen is None:
        seen = set()
    obj_id = id(obj)
    if obj_id in seen:
        return 0
    # Important mark as seen *before* entering recursion to gracefully handle
    # self-referential objects
    seen.add(obj_id)
    if isinstance(obj, dict):
        size += sum([get_size(v, seen) for v in obj.values()])
        size += sum([get_size(k, seen) for k in obj.keys()])
    elif hasattr(obj, '__dict__'):
        size += get_size(obj.__dict__, seen)
    elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
        size += sum([get_size(i, seen) for i in obj])
    return size

Ahora al utilizar esta función en lugar de la del sistema se puede medir lo que ocupa realmente un objeto. Concretamente para los objetos vistos anteriormente se obtienen los siguientes resultados.

print(get_size(1.0))                  # 24
print(get_size(""))                   # 49
print(get_size("Hello!"))             # 55
print(get_size(dict()))               # 240    
print(get_size(dict({'A':1, 'B':2}))) # 396

Básicamente en los objetos primitivos, los numero o las cadenas, no hay cambios. Pero si se observa una diferencia clara entre un diccionario vacío y un diccionario con contenido. Ahora los resultados obtenidos son más coherentes que lo visto anteriormente.

Publicidad


Reducir el consumo de memoria en Python de los objetos

Ahora que ya sabemos medir el tamaño que ocupa en memoria un objeto podemos ver cómo reducir la memoria ocupada. Por ejemplo, se puede definir la siguiente clase y ver lo que ocupa una instancia.

class Person(object):
    def __init__(self, first_name, last_name, age, gender):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age
        self.gender = gender
        
print(get_size(Person("Gayleen", "Eccleshare", 33, 'Female')))

En este caso concreto la memoria ocupada por una instancia es 590 bytes. En un objeto Python es listado de atributos se guarda en un diccionario, esto permite modificar la cantidad de estos en cualquier momento. Por ejemplo, se puede añadir un atributo a la clase Person.

person = Person("Gayleen", "Eccleshare", 33, 'Female')
person.profession = 'Accounting'

Esto es así porque el listado de atributos de un objeto Python se guarda en un diccionario llamado __slots__. Un diccionario no tiene un número fijo de elementos, por lo que se pueden agregar nuevos. Esto es lo que ha permitido añadir un nuevo atributo en tiempo de ejecución, como se ha visto anteriormente. Una característica del lenguaje que no se utiliza habitualmente.

El diccionario que se guarda en __slots__ ocupa una cantidad de memoria importante. Si se define el listado de atributos al diseñar la clase se puede conseguir un ahorro considerable de memoria. Por ejemplo, se puede ver como afecta esto al objeto Persona definido anteriormente.

class Person(object):
    __slots__ = ['first_name', 'last_name', 'age', 'gender']
    def __init__(self, first_name, last_name, age, gender):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age
        self.gender = gender
        
print(get_size(Person("Gayleen", "Eccleshare", 33, 'Female')))

Ahora el espacio ocupado por una instancia idéntica es de 72 bits. Teniendo en cuenta que anteriormente ocupaba 590 bytes, ahora la instancia ocupa un 12% de la memoria original. Esto es, se ha reducido los requisitos de memoria en un factor de 8. Lo único que se ha perdido es la posibilidad de agregar nuevos atributos al objeto en tiempo de ejecución. Ahora, en caso de que se intente agregar un nuevo atributo se tendrá un error.

Conclusiones

La memoria es un recurso importante que se ha de utilizar de forma eficiente. Por lo que reducir el consumo de memoria en Python, o cualquier otro lenguaje, es clave. En esta entrada se ha visto cómo reducir la memoria que emplea un objeto Python en factor de 8. Simplemente agregando una línea de código en los programas. Utilizar este truco puede reducir los recursos necesario para ejecutar un programa y mejorar su rendimiento.

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 4 / 5. Votos emitidos: 1

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane
  • Nuevo conversor de timestamp Unix en el laboratorio de Analytics Lane
  • Calculadora de Contrastes de Hipótesis: interpreta correctamente el p-valor y toma decisiones estadísticas con confianza
  • Calculadora de Tamaño del Efecto: la herramienta clave para entender cuánto importa realmente una diferencia
  • Simulador de DBSCAN: descubre cómo encontrar clusters reales (y ruido) sin fijar K
  • Conversor de Colores: convierte, compara y valida cualquier color en tiempo real
  • Analytics Lane lanza su Generador de UUIDs: identificadores únicos, seguros y listos para producción en segundos
  • 1200 publicaciones en Analytics Lane
  • Analytics Lane lanza su Conversor TIN ↔ TAE: la herramienta definitiva para entender el coste real de depósitos, préstamos e hipotecas

Publicado en: Python

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

mayo 14, 2026 Por Daniel Rodríguez

Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales

mayo 12, 2026 Por Daniel Rodríguez

Costes hundidos en ciencia de datos: cuándo mantener un modelo y cuándo migrar

mayo 7, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Matriz definida positiva en Excel Comprobar si una matriz es definida positiva en Excel sin macros publicado el octubre 18, 2023 | en Ciencia de datos, Herramientas
  • ¿Por qué el azar no es tan aleatorio como parece? publicado el noviembre 11, 2025 | en Opinión
  • Número óptimo de clústeres con Silhouette e implementación en Python publicado el junio 23, 2023 | en Ciencia de datos
  • Redondear con dos decimales en JavaScript publicado el octubre 25, 2023 | en JavaScript
  • JSON en bases de datos: cuándo es buena idea y cuándo no publicado el febrero 24, 2026 | en Ciencia de datos

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.9 (11)

Pandas: Cambiar los tipos de datos en los DataFrames

Comentarios recientes

  • bif en JSON en bases de datos: cuándo es buena idea y cuándo no
  • bif en Cómo desinstalar Oracle Database 19c en Windows
  • M. Pilar en Cómo eliminar las noticias en Windows 11 y recuperar tu concentración
  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2026 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto