Ich habe seit ein paar Tagen nach der richtigen Antwort auf diese Frage gesucht, aber nichts Gutes. Ich bin kein Anfänger in der Programmierung, aber noch nicht einmal auf der mittleren Ebene.
Wenn ich in der Shell von Python bin, tippe ich: dir()
und ich kann alle Namen aller Objekte im aktuellen Bereich (Hauptblock) sehen, es gibt 6 davon:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Wenn ich dann beispielsweise eine Variable deklariere x = 10
, wird diese automatisch zu den Objektlisten unter dem integrierten Modul hinzugefügt dir()
. Wenn ich dir()
erneut tippe, wird jetzt Folgendes angezeigt:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
Gleiches gilt für Funktionen, Klassen und so weiter.
Wie lösche ich all diese neuen Objekte, ohne den Standard 6 zu löschen, der zu Beginn verfügbar war?
Ich habe hier über "Speicherbereinigung", "Bereinigung der Konsole" gelesen, bei der der gesamte Text aus dem Eingabeaufforderungsfenster gelöscht wird:
>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
Aber das alles hat nichts mit dem zu tun, was ich erreichen möchte. Es werden nicht alle verwendeten Objekte entfernt.
quelle
del
Funktion gibt. Ich fange an, Python zu lernen und muss oft in der Shell experimentieren, so dass Standardvariablennamen wiex
odery
oft bereits verwendet werden und der Neustart der Shell weitere 15 Sekunden dauert (ich habe jetzt einen sehr, sehr alten Laptop). Deshalb wollte ich einen Weg finden, um den Python-Speicher schneller zu bereinigen.del
ist nicht genau eine Funktion, daher nein(
und)
. Es ist ein Schlüsselwort, das eine del-Anweisung einführt. Natürlich kann dasx
odery
sollten nicht verwendet werden, es sei denn, Sie verwenden sie. Oder wenn Sie nicht so etwas Dummes tunfrom _somemodule_ import *
, werden Sie alle Arten von Müll auf dem Platz haben. :)Antworten:
Sie können einzelne Namen löschen mit
del
:oder Sie können sie aus dem
globals()
Objekt entfernen :Dies ist nur eine Beispielschleife. Es löscht defensiv nur Namen, die nicht mit einem Unterstrich beginnen, und geht davon aus, dass Sie zu Beginn in Ihrem Interpreter nur Namen ohne Unterstrich verwendet haben. Sie können stattdessen eine fest codierte Liste von Namen verwenden (Whitelist), wenn Sie wirklich gründlich sein möchten. Es gibt keine eingebaute Funktion, um das Löschen für Sie durchzuführen, außer nur den Interpreter zu beenden und neu zu starten.
Von Ihnen importierte Module (
import os
) bleiben importiert, da auf sie verwiesen wirdsys.modules
. Nachfolgende Importe verwenden das bereits importierte Modulobjekt wieder. Sie haben in Ihrem aktuellen globalen Namespace einfach keinen Verweis darauf.quelle
startswith('_')
scheint ziemlich naiv. Wenn jemand klug genug ist zu schreiben_foo=42
oder sogar__foo__=42
, wie können wir diese löschen? Gibt es eine Möglichkeit, die Namen der Standardmoduleigenschaften programmgesteuert abzurufen?dir(ModuleType())
, aber es kehrt nur zurückdoc
undname
.Ja. Es gibt eine einfache Möglichkeit, alles in iPython zu entfernen. Geben Sie in der iPython-Konsole einfach Folgendes ein:
Dann werden Sie vom System zur Bestätigung aufgefordert. Drücken Sie y. Wenn Sie diese Eingabeaufforderung nicht sehen möchten, geben Sie einfach Folgendes ein:
Das sollte funktionieren..
quelle
Sie können Python Garbage Collector verwenden:
quelle
Wenn Sie sich in einer interaktiven Umgebung wie
Jupyter
oder befindenipython
, möchten Sie möglicherweise unerwünschte Variablen entfernen, wenn diese schwer werden.Die Magie befiehlt
reset
undreset_selective
ist in interaktiven Python-Sitzungen wieipython
und verfügbarJupyter
1)
reset
in
und dieout
Parameter geben an, ob Sie die In / Out-Caches leeren möchten. Der Verzeichnisverlauf wird mit demdhist
Parameter geleert.Ein weiteres interessantes ist,
array
dass nur numpy Arrays entfernt werden:2) reset_selective
Beispiel für ein sauberes Array:
Quelle: http://ipython.readthedocs.io/en/stable/interactive/magics.html
quelle
Das hat bei mir funktioniert.
Sie müssen es zweimal für Globals ausführen, gefolgt von Einheimischen
quelle
Tatsächlich stellt Python den Speicher wieder her, der nicht mehr verwendet wird. Dies wird als Garbage Collection bezeichnet, ein automatischer Prozess in Python. Wenn Sie dies dennoch tun möchten, können Sie es mit löschen
del variable_name
. Sie können dies auch tun, indem Sie die Variable zuweisenNone
Die einzige Möglichkeit, Speicher von nicht referenzierten Python-Objekten wirklich zurückzugewinnen, ist der Garbage Collector. Das Schlüsselwort del löst einfach die Bindung eines Namens von einem Objekt, aber das Objekt muss noch durch Müll gesammelt werden. Sie können den Garbage Collector zwingen, mit dem GC-Modul ausgeführt zu werden. Dies ist jedoch mit ziemlicher Sicherheit eine vorzeitige Optimierung, birgt jedoch eigene Risiken. Die Verwendung
del
hat keine wirklichen Auswirkungen, da diese Namen gelöscht worden wären, da sie ohnehin nicht mehr gültig waren.quelle
del
hier also einen echten Effekt.