2017-06-08 6 views
0

Führt Python eine Analyse durch, um Speicher früher freizugeben? Zum Beispiel, wenn ich habe:Wann werden Daten freigegeben?

d = some big array 
# ... use(d) ... 

# no d is used from here 
# a lot of other code, the code could use more big arrays 

Wann entscheidet Python den Speicher von d verwendet löschen? Wenn ich d in einer Funktion verwende, wird d freigegeben, wenn die Funktion ausgeführt wird?

Vielleicht ist das im Allgemeinen schwierig, weil d anderen zugewiesen werden kann und sie können weiter d verwenden, nachdem die Funktion beendet ist.

aber ich war auf der Suche nach ein paar gute Praxis, die Python weniger Speicher halten kann ...

+1

Verwenden Sie 'del d', wenn Sie' d' nicht mehr verwenden. – nsilent22

+1

@ nsilent22 Es wird nur der Name "d" dereferenziert, aber das Array wird nicht aus dem Speicher gelöscht (außer es war die einzige Referenz). –

+1

Wie viele andere Sprachen verwendet Python einen Garbage Collector. Aber die Details der Speicherbereinigung sind Implementierung definiert. Die meisten Implementierungen, von denen ich weiß, dass sie Referenzzählen verwenden, wie @ nsilent22 erwähnt, können mit 'del' Verweise auf Objekte entfernen, wodurch sie für eine GC'd qualifiziert sind. – 0x5453

Antwort

0

Alle Daten werden durch obje dargestellt cts. Variablen sind Verweise auf diese Objekte (ähnlich wie Referenztypen in Java).

Ein Objekt wird als Garbage Collection erfasst, wenn es keine Möglichkeit gibt, auf dieses Objekt zuzugreifen (die Gesamtzahl der Referenzen, die auf dieses Objekt verweisen, sinkt auf 0).

Um eine Referenz auf ein Objekt explizit zu löschen, verwenden Sie die Direktive del. Wenn Sie den einzigen Verweis auf ein Objekt löschen, wird dieses Objekt als Müll erfasst.

Alle lokalen Variablen werden automatisch mit Garbage Collection gesammelt, sobald die Funktion zurückkehrt, Sie müssen es nicht selbst tun.

0

Um nur ein bisschen zu der Situation hinzuzufügen, wenn d in der Funktion verwendet wird, hängt es davon ab, wann d deklariert wird. Wenn d innerhalb der Funktion deklariert ist und es keine innere Funktion gibt, die auf d referenziert, wird Garbage Collected gesammelt.

zum Beispiel:

def outer(): 
    d = np.arange(10000) 
    def inner(): 
     d += 1 
     return d 
    return inner 

in diesem Fall d wird noch im Speicher befindet, wenn nach outer() Funktion zurückgegeben wird.

Verwandte Themen