2013-02-19 11 views
14

Aufruf del für eine Variable in Python. Gibt es den zugewiesenen Speicher sofort frei oder wartet immer noch darauf, dass der Garbage Collector erfasst wird? Wie in Java hat das explizite Aufrufen von del keine Auswirkung darauf, wann der Speicher freigegeben wird.Python del statement

+0

Der Punkt der Garbage Collection ist, dass Sie sich nicht darum kümmern, wenn der Speicher freigegeben wird . Warum machst du dir deswegen Sorgen? –

+0

Ich verarbeite große Datenmengen und beobachte Probleme mit Speicherlecks. Ich bin mir fast sicher, dass das Problem nicht im Python-Skript liegt, sondern nur, um sicherzugehen. – ninja

Antwort

18

Die Del-Anweisung beansprucht keinen Speicher. Es entfernt eine Referenz, die den Referenzzähler auf den Wert dekrementiert. Wenn der Zählwert null ist, kann der Speicher zurückgewonnen werden. CPython wird den Speicher sofort zurückfordern, es ist nicht nötig, auf die Ausführung des Garbage Collectors zu warten.

In der Tat wird der Garbage Collector nur für die Wiederherstellung von zyklischen Strukturen benötigt.

Wie Waleed Khan in seinem Kommentar sagt, Python Speicherverwaltung funktioniert einfach, Sie müssen sich nicht darum kümmern.

+1

Ich glaube nicht, dass CPython den Speicher jemals wieder an das Betriebssystem zurückgibt, selbst nachdem es zurückgewonnen wurde. – martineau

+0

Wenn Sie also sagen "Wenn der Zählerstand Null ist, kann der Speicher zurückgewonnen werden.", Meinen Sie, dass es immer noch warten muss, bis der Garbage Collector "tatsächlich" zurückgewonnen wurde oder? – ninja

+2

Ich bin nicht sicher, wie ich es sonst noch sagen könnte: "CPython wird den Speicher sofort zurückfordern, es gibt keine Notwendigkeit zu warten, bis der Garbage Collector ausgeführt wird." –

2

"Das Löschen eines Namens entfernt die Bindung dieses Namens aus dem lokalen oder globalen Namespace". Nicht mehr und nicht weniger. Es tut nichts mit dem Objekt, auf das der Name zeigt, außer dem Verringern seines refcount, und wenn refcount nicht Null ist, wird das Objekt nicht erfasst, selbst wenn GC ausgeführt wird.

1

Auch die del Anweisung scheint ein wenig schneller als Keine (ähnlich Java Stil Zuweisung null auf eine Variable seinen Speicher frei ...) Zuordnen zu sein.

Zum Vergleich:

import time, math 

def measure_del(): 
     start = time.time() 
     for i in range(0,int(math.pow(10,8))): 
        a = "123" 
        del a # <--- !!! 
     end = time.time() 
     print(end-start) 

def measure_none(): 
     start = time.time() 
     for i in range(0,int(math.pow(10,8))): 
        a = "123" 
        a = None # <--- !!! 
     end = time.time() 
     print(end-start) 

Ergebnisse in (in idle3.4 läuft):

>>> measure_del() 
3.9930295944213867 
>>> measure_del() 
3.7402305603027344 
>>> measure_del() 
3.8423104286193848 
>>> measure_del() 
3.753770351409912 
>>> measure_del() 
3.7772741317749023 
>>> measure_del() 
3.815058946609497 

>>> measure_none() 
4.052351236343384 
>>> measure_none() 
4.130320072174072 
>>> measure_none() 
4.082390069961548 
>>> measure_none() 
4.100180625915527 
>>> measure_none() 
4.071730375289917 
>>> measure_none() 
4.136169672
+0

Warum sind Programmierer so fasziniert von der Schnelligkeit der Dinge, die keinen Einfluss auf die Gesamtgeschwindigkeit des Programms haben? :) –

+0

Nun, es ist so etwas wie eine Packung Papier. Z.B. Sie können 500 Blatt mit einer Grammatur von 80 g/m² oder 90 g/m² kaufen. Wenn Sie auf einem einzigen Blatt schreiben, werden Sie kaum einen Unterschied bemerken. Aber wenn Sie beide Pakete vergleichen, sehen Sie einen deutlichen Unterschied in Höhe, Gewicht und Preis. Wenn man guten Code schreibt, ist es sicherlich keine schlechte Idee, die Lesbarkeit des Codes mit der Leistung auf Maschinenebene in Einklang zu bringen. – Barpfotenbaer