¿Python tiene una pila / montón y cómo se administra la memoria?

91

¿Cómo se administran las variables y la memoria en Python? ¿Tiene una pila y un montón y qué algoritmo se usa para administrar la memoria? Teniendo en cuenta este conocimiento, ¿existen recomendaciones sobre la gestión de la memoria para procesar grandes números / datos?

Matt Alcock
fuente
1
Es posible que desee leer los dos siguientes: foobarnbaz.com/2012/07/08/understanding-python-variables docs.python.org/2/c-api/memory.html
user1690293
1
¿Existe algún problema específico con la administración de var / memory de Python con el que tenga un problema y no lo descubra trivialmente la documentación de Python y / o Google?
Martin James

Respuestas:

111

¿Cómo se administran las variables y la memoria en Python?

¡Automágicamente! No, en realidad, solo crea un objeto y la máquina virtual Python maneja la memoria necesaria y dónde se colocará en el diseño de la memoria.

¿Tiene una pila y un montón y qué algoritmo se usa para administrar la memoria?

Cuando hablamos de CPythonél, usa un montón privado para almacenar objetos. De la documentación de la API de CPython C :

La gestión de la 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 de almacenamiento dinámico, como compartir, segmentar, preasignar o almacenar en caché.

La recuperación de memoria se maneja principalmente mediante el recuento de referencias . Es decir, la VM Python mantiene un diario interno de cuántas referencias se refieren a un objeto, y la basura lo recolecta automáticamente cuando no hay más referencias que se refieren a él. Además, hay un mecanismo para romper referencias circulares (que el recuento de referencias no puede manejar) detectando "islas" inalcanzables de objetos, algo al revés de los algoritmos GC tradicionales que intentan encontrar todos los objetos alcanzables.

NOTA: Tenga en cuenta que esta información esCPythonespecífica. Otras implementaciones pitón, tales comopypy,iron python,jythony otros pueden ser diferentes unos de otros y de CPython cuando se trata de sus implementaciones específicas. Para comprenderlo mejor, puede ser útil comprender que existe una diferencia entre Python, la semántica (el lenguaje) y la implementación subyacente.

Teniendo en cuenta este conocimiento, ¿existen recomendaciones sobre la gestión de la memoria para procesar grandes números / datos?

Ahora no puedo hablar de esto, pero estoy seguro de que NumPy (la biblioteca de Python más popular para procesar números) tiene mecanismos que manejan el consumo de memoria con elegancia.

Si desea saber más sobre los aspectos internos de Python, eche un vistazo a estos recursos:

NocheNFotis
fuente
5
Bien por tu parte, enfatiza la distinción de Python vs CPython;)
phant0m
1
Tenga en cuenta que las variables locales tendrán las variables reales almacenadas en el equivalente de un marco de pila.
Marcin
1
Python no es Java; no tiene una máquina virtual; tiene intérprete. Puede parecer pedante señalar esto, pero son dos paradigmas diferentes y la diferencia tiene implicaciones importantes sobre cómo se compila y ejecuta el código. stackoverflow.com/questions/441824/…
Apollo2020
48

Python no tiene ninguno tal cosa.

Python es el lenguaje y no especifica cómo exactamente las implementaciones deben lograr la semántica definida por Python el lenguaje.

Cada implementación (CPython, PyPy, IronPython, Stackless , Jython ...) es libre de hacer lo suyo!

En C Python, todos los objetos viven en el montón:

La gestión de la memoria en Python implica un montón privado que contiene todos los objetos y estructuras de datos de Python. 1

La máquina virtual CPython se basa en pilas:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

Tenga en cuenta que esto es específico de CPython. Sin embargo, la pila no contiene los valores reales , mantiene referencias a esos objetos.

1 : fuente

phant0m
fuente