web-dev-qa-db-fra.com

Est-ce que Python a une pile / tas et comment la mémoire est-elle gérée?

Comment les variables et la mémoire sont-elles gérées en Python? At-il une pile et un tas et quel algorithme est utilisé pour gérer la mémoire? Compte tenu de ces connaissances, existe-t-il des recommandations sur la gestion de la mémoire pour le traitement des grands nombres/données?

77
Matt Alcock

Comment les variables et la mémoire sont-elles gérées en Python?.

Automagiquement! Non, vraiment, vous créez simplement un objet et la machine virtuelle Python gère la mémoire nécessaire et son emplacement dans la structure de la mémoire.

At-il une pile et un tas et quel algorithme est utilisé pour gérer la mémoire?

Lorsque nous parlons de CPython, il utilise un segment de mémoire privé pour stocker des objets. d'après la documentation de l'API CPython C :

La gestion de la mémoire dans Python implique un segment de mémoire privé contenant tous les objets Python et toutes les structures de données. La gestion de ce segment privé est assurée en interne par le gestionnaire de mémoire Python. Le gestionnaire de mémoire Python comporte différents composants qui traitent de divers aspects de la gestion du stockage dynamique, tels que le partage, la segmentation, la pré-allocation ou la mise en cache.

La récupération de la mémoire est principalement gérée par comptage de références . En d’autres termes, le Python VM tient un journal interne indiquant le nombre de références faisant référence à un objet et le récupère automatiquement lorsqu'il ne contient plus aucune référence. De plus, il y a n mécanisme pour rompre les références circulaires (que le comptage de références ne peut pas gérer) en détectant des "îlots" inaccessibles d'objets, n peu à l'inverse des algorithmes GC traditionnels qui essayent de trouver tous les objets accessibles.

NOTE: Veuillez garder à l'esprit que cette information est CPython spécifique. D'autres implémentations python, telles que pypy, iron python, jython et d'autres peuvent différer les unes des autres et de CPython en ce qui concerne leurs spécificités d'implémentation. Pour mieux comprendre cela , il peut être utile de comprendre qu'il existe une différence entre Python, la sémantique (le langage) et l'implémentation sous-jacente

Compte tenu de ces connaissances, existe-t-il des recommandations sur la gestion de la mémoire pour le traitement des grands nombres/données?

Maintenant, je ne peux pas en parler, mais je suis sûr que NumPy (la bibliothèque la plus populaire python pour le calcul des chiffres) a des mécanismes qui gèrent la consommation de mémoire avec élégance.

Si vous souhaitez en savoir plus sur les composants internes de Python, consultez ces ressources:

98
NlightNFotis

Python n'a pas aucun une telle chose.

Python est le langage et ne précise pas comment exactement implémentations doit réaliser la sémantique définie par Python le langage.

Chaque implémentation (CPython, PyPy, IronPython, Stackless, Jython ...) est libre de faire sa propre chose!

Dans CPython, tous objets vivent sur le tas:

La gestion de la mémoire dans Python implique un segment de mémoire privé contenant tous les Python objets et structures de données.1

La machine virtuelle CPython est basée sur une pile:

>>> 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)

Gardez à l'esprit que cela est spécifique à CPython. La pile ne contient pas les valeurs actual, cependant, elle conserve les références à ces objets.

1: Source

43
phant0m