• 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
      • Ajuste de Curvas
      • Calculadora de Matrices
    • 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)
    • Negocios
      • CLV
      • Scoring
    • 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.

La caverna del consumo, o cómo Greenspan miraba calzoncillos para hacer política monetaria – El bestiario de los indicadores económicos absurdos (parte 1)
En Analytics Lane
La caverna del consumo, o cómo Greenspan miraba calzoncillos para hacer política monetaria – El bestiario de los indicadores económicos absurdos (parte 1)

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

  • La caverna del consumo, o cómo Greenspan miraba calzoncillos para hacer política monetaria – El bestiario de los indicadores económicos absurdos (parte 1)
  • La vanidad del paisaje, o por qué un becario sale a contar grúas a Manhattan – El bestiario de los indicadores económicos absurdos (parte 2)
  • Augurios deportivos y portadas malditas, o cuando The Economist predice mejor al revés – El bestiario de los indicadores económicos absurdos (parte 3)
  • El bestiario de los indicadores económicos absurdos: El zoo patrio
  • El Binning en Credit Scoring: El Arte de Discretizar Variables
  • Cómo comparar tendencias con gráficos de líneas en Matplotlib: guía práctica paso a paso
  • Analytics Lane lanza la versión 1.2 del laboratorio con nuevas herramientas de ajuste de curvas y cálculo matricial
  • Analytics Lane lanza la versión 1.3 del laboratorio con nuevas herramientas de evaluación de modelos y utilidades prácticas
  • DBSCAN y la selección de ε: teoría, intuición y aplicación práctica

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

DBSCAN y la selección de ε: teoría, intuición y aplicación práctica

junio 30, 2026 Por Daniel Rodríguez

El bestiario de los indicadores económicos absurdos: El zoo patrio

junio 25, 2026 Por Daniel Rodríguez

Por qué el banco te ofrece un 3% TAE y no es lo que parece

junio 23, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Cómo ejecutar modelos de lenguaje en local: Guía fácil para usar LM Studio en tu ordenador publicado el enero 29, 2025 | en Herramientas
  • Simulador martingala en Matlab con GUIDE publicado el mayo 27, 2019 | en Matlab
  • Cerca La regresión logística publicado el julio 23, 2018 | en Ciencia de datos
  • Mejores extensiones de VS Code para científicos de datos publicado el octubre 9, 2024 | en Ciencia de datos, Herramientas
  • FileNotFoundError en Python: Guía para abrir archivos correctamente en Python publicado el febrero 10, 2025 | en Python

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.1 (11)

Aplicar el método D’Hondt en Excel

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