¿Cómo funciona la gestión de memoria Python?

De acuerdo, tengo este concepto de una clase que permitiría a otras clases importar clases como base, y si lo usas, debes importarlo. ¿Cómo lo haría para implementarlo? O, ¿el intérprete de Python ya hace esto de alguna manera? ¿Destruye las clases que no se usan de la memoria, y cómo?

Sé que C ++ / C están muy orientados a la memoria con punteros y todo eso, pero ¿es Python? Y no estoy diciendo que tenga problemas con eso; Más o menos quiero modificarlo para el diseño de mi progtwig. Quiero escribir un progtwig grande que use cientos de clases y módulos. Pero me temo que si hago esto bloquearé la aplicación, ya que no entiendo cómo Python maneja la administración de la memoria.

Sé que es una pregunta vaga, pero si alguien me vincula o me señala en la dirección correcta, sería muy apreciado.

Python, como C #, Java, Perl, Ruby, Lua y muchos otros idiomas, utiliza la recolección de basura en lugar de la administración de memoria manual. Simplemente crea objetos libremente y el administrador de memoria del idioma periódicamente (o cuando lo dirige específicamente) busca cualquier objeto que ya no esté referenciado por su progtwig.

Entonces, si quieres aferrarte a un objeto, solo mantén una referencia a él. Si desea que el objeto sea liberado (eventualmente) elimine cualquier referencia a él.

 def foo(names): for name in names: print name foo(["Eric", "Ernie", "Bert"]) foo(["Guthtrie", "Eddie", "Al"]) 

Cada una de estas llamadas a foo crea un objeto de list Python inicializado con tres valores. Durante la duración de la llamada foo , los names las variables hacen referencia a ellos, pero tan pronto como esa función sale, ninguna variable mantiene una referencia a ellos y es un juego justo para que el recolector de basura los elimine.

Lea los siguientes artículos sobre Python Memory Management:

Python: Gestión de la memoria

Extracto: (los ejemplos se pueden encontrar en el artículo):

La administración de memoria en Python implica un montón privado que contiene todos los objetos y estructuras de datos de Python. La administración de este montón privado está asegurada internamente por el administrador de memoria de Python. El administrador de memoria de Python tiene diferentes componentes que se ocupan de varios aspectos de la administración del almacenamiento dynamic, como compartir, segmentar, preasignar o almacenar en caché.

En el nivel más bajo, un asignador de memoria sin procesar garantiza que haya suficiente espacio en el montón privado para almacenar todos los datos relacionados con Python al interactuar con el administrador de memoria del sistema operativo. Además del asignador de memoria en bruto, varios asignadores específicos de objeto operan en el mismo montón e implementan distintas políticas de administración de memoria adaptadas a las peculiaridades de cada tipo de objeto. Por ejemplo, los objetos enteros se administran de manera diferente dentro del montón que las cadenas, tuplas o diccionarios porque los enteros implican diferentes requisitos de almacenamiento y compensaciones de velocidad / espacio. El administrador de memoria de Python, por lo tanto, delega parte del trabajo a los asignadores específicos del objeto, pero asegura que estos últimos operen dentro de los límites del montón privado.

Es importante comprender que la administración del montón de Python la realiza el propio intérprete y que el usuario no tiene control sobre él, incluso si manipula regularmente los punteros de los objetos a los bloques de memoria dentro de ese montón. La asignación de espacio de almacenamiento dynamic para los objetos de Python y otros buffers internos se realiza a pedido del administrador de memoria de Python a través de las funciones de la API de Python / C enumeradas en este documento.

 x =10 print (type(x)) 

gestor de memoria (MM): x apunta a 10

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

(MM): y apunta al mismo objeto 10

 x=x+1 if(id(x) != id(y)): print('x and y refer to different objects') 

(MM): x puntos a otro objeto es 11, el objeto apuntado previamente fue destruido

 z=10 if(id(y) != id(z)): print('y and z refer to same object') else: print('y and z refer different objects') 
  • La gestión de memoria de Python se divide en dos partes.
    1. Memoria de stack
    2. Memoria de stack
  • Los métodos y las variables se crean en la memoria de la stack.
  • Los objetos y los valores de las variables de instancia se crean en la memoria Heap.
  • En la memoria de stack: se crea un marco de stack cada vez que se crean métodos y variables.
  • Estos cuadros de stacks se destruyen automáticamente cada vez que las funciones / métodos regresan.
  • Python tiene un mecanismo de recolector de basura, tan pronto como las variables y funciones regresan, el recolector de basura borra los objetos muertos.

Mis 5 centavos:

  1. lo más importante es que Python libera memoria solo para objetos referenciados (no para clases porque son solo contenedores o tipos de datos personalizados). De nuevo, en python todo es un objeto, por lo que int, float, string, [], {} y () todos son objetos. Eso significa que si su progtwig ya no hace referencia a ellos, son víctimas de la recolección de basura.

  2. Aunque python utiliza el ‘Recuento de referencias’ y ‘GC’ para liberar memoria (para los objetos que no están en uso), esta memoria libre no se devuelve al sistema operativo (aunque en diferentes casos, en Windows). Esto significa que la porción de memoria libre simplemente regresa al intérprete de Python, no al sistema operativo. Por lo tanto, su proceso de Python mantendrá la misma memoria. Sin embargo, Python utilizará esta memoria para asignar a algunos otros objetos.

Muy buena explicación para esto dada en: http://deeplearning.net/software/theano/tutorial/python-memory-management.html

Sí, es el mismo comportamiento en python3 también