Python ha uno stack / heap e come viene gestita la memoria?


91

Come vengono gestite le variabili e la memoria in Python? Ha uno stack e un heap e quale algoritmo viene utilizzato per gestire la memoria? Data questa conoscenza, ci sono raccomandazioni sulla gestione della memoria per il crunch di grandi numeri / dati?



1
C'è qualche problema specifico con la gestione della memoria / var di Python con cui stai riscontrando un problema e che non viene scoperto banalmente dalla documentazione di Python e / o da Google?
Martin James,

Risposte:


111

Come vengono gestite le variabili e la memoria in Python.

Automagicamente! No, davvero, devi solo creare un oggetto e la macchina virtuale Python gestisce la memoria necessaria e dove deve essere collocata nel layout della memoria.

Ha uno stack e un heap e quale algoritmo viene utilizzato per gestire la memoria?

Quando ne parliamo CPythonutilizza un heap privato per la memorizzazione di oggetti. Dalla documentazione dell'API C CPython :

La gestione della memoria in Python implica un heap privato contenente tutti gli oggetti e le strutture dati Python. La gestione di questo heap privato è assicurata internamente dal gestore della memoria Python. Il gestore della memoria Python ha diversi componenti che si occupano di vari aspetti della gestione dinamica dell'archiviazione, come condivisione, segmentazione, preallocazione o memorizzazione nella cache.

Il recupero della memoria viene gestito principalmente dal conteggio dei riferimenti . Cioè, la VM Python mantiene un journal interno di quanti riferimenti si riferiscono a un oggetto e lo raccoglie automaticamente quando non ci sono più riferimenti che fanno riferimento ad esso. Inoltre, esiste un meccanismo per rompere i riferimenti circolari (che il conteggio dei riferimenti non è in grado di gestire) rilevando "isole" di oggetti non raggiungibili, in qualche modo al contrario dei tradizionali algoritmi GC che cercano di trovare tutti gli oggetti raggiungibili.

NOTA: tieni presente che queste informazioni sonoCPythonspecifiche. Altre implementazioni pitone, qualipypy,iron python,jythone altri possono differire tra loro e da CPython quando si tratta di loro specifiche di implementazione. Per capirlo meglio, può aiutare a capire che c'è una differenza tra Python la semantica (il linguaggio) e l'implementazione sottostante

Data questa conoscenza, ci sono raccomandazioni sulla gestione della memoria per il crunch di grandi numeri / dati?

Ora non posso parlare di questo, ma sono sicuro che NumPy (la libreria Python più popolare per lo scricchiolio dei numeri) ha meccanismi che gestiscono il consumo di memoria con grazia.

Se desideri saperne di più sugli interni di Python, dai un'occhiata a queste risorse:


5
Bravo a sottolineare la distinzione tra Python e CPython;)
phant0m

1
Notare che le variabili locali avranno le variabili effettive memorizzate nell'equivalente di uno stack frame.
Marcin

1
Python non è Java; non ha una macchina virtuale; ha un interprete. Può sembrare pedante sottolineare questo, ma sono due paradigmi diversi e la differenza ha importanti implicazioni per il modo in cui il codice viene compilato ed eseguito. stackoverflow.com/questions/441824/…
Apollo2020

48

Python non ha nulla di simile.

Python è il linguaggio e non specifica come esattamente le implementazioni devono raggiungere la semantica definita da Python il linguaggio.

Ogni implementazione (CPython, PyPy, IronPython, Stackless , Jython ...) è libera di fare le sue cose!

In C Python, tutti gli oggetti vivono nell'heap:

La gestione della memoria in Python implica un heap privato contenente tutti gli oggetti e le strutture dati Python. 1

La macchina virtuale CPython è basata sullo stack:

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

Tieni presente che questo è specifico di CPython. Lo stack non contiene i valori effettivi , tuttavia, mantiene i riferimenti a quegli oggetti.

1 : fonte

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.