Gestión de memoria en Python

Comprender la asignación de memoria es importante para cualquier desarrollador de software, ya que escribir código eficiente significa escribir un código eficiente en memoria. La asignación de memoria se puede definir como la asignación de un bloque de espacio en la memoria de la computadora a un programa. En Python, el método de asignación y desasignación de memoria es automático, ya que los desarrolladores de Python crearon un recolector de basura para Python para que el usuario no tenga que hacer una recolección manual de basura.

Recolección de basura

La recolección de basura es un proceso en el que el intérprete libera la memoria cuando no está en uso para que esté disponible para otros objetos.
Supongamos un caso en el que ninguna referencia apunta a un objeto en la memoria, es decir, no está en uso, por lo que la máquina virtual tiene un recolector de basura que elimina automáticamente ese objeto de la memoria del montón.

Nota: Para obtener más información, consulte Recolección de basura en Python

Conteo de referencia

El recuento de referencias funciona contando el número de veces que otros objetos del sistema hacen referencia a un objeto. Cuando se eliminan las referencias a un objeto, se reduce el recuento de referencias de un objeto. Cuando el recuento de referencias llega a cero, el objeto se desasigna.

Por ejemplo, supongamos que hay dos o más variables que tienen el mismo valor, entonces, lo que hace la máquina virtual de Python es, en lugar de crear otro objeto del mismo valor en el montón privado, en realidad hace que la segunda variable apunte a ese originalmente valor existente en el montón privado. Por lo tanto, en el caso de las clases, tener una cantidad de referencias puede ocupar una gran cantidad de espacio en la memoria, en tal caso, el conteo de referencias es muy beneficioso para preservar la memoria para que esté disponible para otros objetos.

Ejemplo:

x = 10

Cuando x = 10se ejecuta se crea un objeto entero 10 en memoria y se asigna su referencia a la variable x, esto se debe a que todo es objeto en Python.

memory-allocation-python-1

Verifiquemos si es verdad

x = 10
y = x
  
if id(x) == id(y):
    print("x and y refer to the same object")

Producción:

x and y refer to the same object

En el ejemplo anterior, y = xcreará otra variable de referencia y que se referirá al mismo objeto porque Python optimiza la utilización de la memoria asignando la misma referencia de objeto a una nueva variable si el objeto ya existe con el mismo valor.

memory-allocation-python-2

Ahora, cambiemos el valor de x y veamos qué sucede.

x = 10
y = x
x += 1
  
if id(x) != id(y):
    print("x and y do not refer to the same object")

Producción:

x and y do not refer to the same object

Entonces ahora x se refiere a un nuevo objeto x y el enlace entre x y 10 se desconecta pero y todavía se refiere a 10.

memory-allocation-python-1-1

Asignación de memoria en Python

Hay dos partes de la memoria:

  • memoria de pila
  • memoria de montón

Los métodos/llamadas a métodos y las referencias se almacenan en la memoria de pila y todos los objetos de valores se almacenan en un montón privado .

Trabajo de memoria de pila

La asignación ocurre en bloques contiguos de memoria. Lo llamamos asignación de memoria de pila porque la asignación ocurre en la pila de llamadas de función. El compilador conoce el tamaño de la memoria que se asignará y cada vez que se llama a una función, sus variables obtienen memoria asignada en la pila.

Es la memoria que solo se necesita dentro de una función o llamada de método en particular. Cuando se llama a una función, se agrega a la pila de llamadas del programa. Todas las asignaciones de memoria local, como las inicializaciones de variables dentro de las funciones particulares, se almacenan temporalmente en la pila de llamadas de función, donde se elimina una vez que la función regresa y la pila de llamadas pasa a la siguiente tarea. El compilador maneja esta asignación en un bloque contiguo de memoria mediante rutinas predefinidas, y los desarrolladores no necesitan preocuparse por ello.

Ejemplo:

def func(): 
        
    # All these variables get memory  
    # allocated on stack  
    a = 20
    b = [] 
    c = "" 

Trabajo de la memoria del montón

La memoria se asigna durante la ejecución de instrucciones escritas por programadores. Tenga en cuenta que el montón de nombres no tiene nada que ver con la estructura de datos del montón. Se llama montón porque es una pila de espacio de memoria disponible para que los programadores asignen y desasignen. Las variables se necesitan fuera de las llamadas a métodos o funciones o se comparten dentro de múltiples funciones globalmente y se almacenan en la memoria Heap.

Ejemplo:

# This memory for 10 integers  
# is allocated on heap.  
a = [0]*10 

Publicación traducida automáticamente

Artículo escrito por asishmishra0595 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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