116 votes

Python possède-t-il une pile/un tas et comment la mémoire est-elle gérée ?

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

131voto

NlightNFotis Points 2689

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

Automatiquement ! Non, vraiment, vous créez simplement un objet et la machine virtuelle Python gère la mémoire nécessaire et l'endroit où il doit être placé dans la disposition de la mémoire.

Dispose-t-il d'une pile et d'un tas et quel algorithme est utilisé pour gérer les fichiers de données ? la mémoire ?

Lorsque nous parlons de CPython il utilise un tas privé pour le stockage des objets. Extrait de la documentation de l'API C de CPython :

La gestion de la mémoire en Python fait intervenir un tas privé contenant tous les fichiers objets et structures de données Python. La gestion de ce tas privé privé est assurée en interne par le gestionnaire de mémoire Python. Le gestionnaire de mémoire Python possède différents composants qui traitent de diverses aspects de la gestion dynamique du stockage, comme 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érence . En d'autres termes, la VM Python tient un journal interne du nombre de références à un objet et le met automatiquement à la poubelle lorsqu'il n'y a plus de références à cet objet. En outre, il y a un mécanisme permettant de rompre les références circulaires (que le comptage de références ne peut pas gérer) en détectant les "îlots" d'objets inaccessibles, un peu à l'inverse des algorithmes traditionnels de GC qui essaient de trouver tous les objets atteignables.

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

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

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

Si vous souhaitez en savoir plus sur les internes de Python, jetez un coup d'œil à ces ressources :

62voto

phant0m Points 8545

Python n'a pas tout une telle chose.

Python est le langue et ne précise pas comment exactement mises en œuvre doit respecter la sémantique définie par le langage Python.

Chaque implémentation (CPython, PyPy, IronPython, Stackless , Jython...) est libre de faire ce qu'il veut !

Sur C Python, tous vivent sur le tas :

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

La machine virtuelle CPython est basée sur la 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 ceci est spécifique à CPython. La pile ne contient pas le réel cependant, il conserve les références à ces objets.

1 : Source :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X