Question Python a-t-il un stack / heap et comment la mémoire est-elle gérée?


Comment sont gérées les variables et la mémoire en Python? A-t-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?


61
2018-01-27 09:47


origine


Réponses:


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

Automatiquement! Non, en réalité, vous créez simplement un objet et la machine virtuelle Python gère la mémoire nécessaire et où elle doit être placée dans la disposition de la mémoire.

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

Quand on parle CPython il utilise un tas privé pour stocker des objets. De la documentation de l'API CPython C:

La gestion de la mémoire en Python implique un tas privé contenant tous   Objets Python et structures de données. La gestion de ce privé   heap est assuré en interne par le gestionnaire de mémoire Python. Le python   gestionnaire de mémoire a différents composants qui traitent de divers   aspects de gestion du stockage dynamique, tels que le partage, la segmentation,   préallocation ou mise en cache.

La récupération de la mémoire est principalement gérée par comptage de référence. C'est-à-dire que la machine virtuelle Python conserve un journal interne indiquant le nombre de références renvoyant à un objet, et les déchets sont automatiquement collectés lorsqu'il n'y a plus de références s'y rapportant. De plus, il y a un mécanisme pour casser des références circulaires (que le comptage de référence ne peut pas gérer) en détectant des "îlots" d'objets inaccessibles, un peu en retrait des algorithmes traditionnels du GC qui essaient de trouver tous les objets accessibles.

REMARQUE: S'il vous plaît gardez à l'esprit que cette information est CPython spécifique. Autres implémentations de python, telles que pypy, iron python, jython et d'autres peuvent différer les uns des autres et de CPython en ce qui concerne leurs spécificités d'implémentation. Pour mieux comprendre ça, 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 de python la plus populaire pour le traitement des nombres) possède des mécanismes qui gèrent la consommation de mémoire avec élégance.

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


81
2018-01-27 09:55



Python n'a pas tout telle chose.

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

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

Dans CPython, tout les objets 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 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 c'est spécifique à CPython. La pile ne contient pas le réel valeurs cependant, il garde des références à ces objets.

1: La source


36
2018-01-27 11:06