Is er een manier om variabelen, functies, enz. uit het geheugen van de tolk te verwijderen?

Ik heb nu een paar dagen op zoek naar het juiste antwoord op deze vraag, maar heb niets goeds. Ik ben geen complete beginner in het programmeren, maar nog niet zelfs op het tussenliggende niveau.

Wanneer ik in de schaal van Python ben, typ ik: dir()en ik kan alle namen zien van alle objecten in de huidige scope (hoofdblok), er zijn er 6 van hen:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

Dan, wanneer ik een variabele aandeel, bijvoorbeeld x = 10, voegt het automatisch toe aan die lijsten van objecten onder de ingebouwde module dir(), En wanneer ik dir()opnieuw typt, wordt het nu weergegeven:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

Hetzelfde geldt voor functies, klassen enzovoort.

Hoe verwijder ik al die nieuwe objecten zonder de standaard 6 te wissen die in het begin beschikbaar is?

Ik heb hier gelezen over “Memory Cleaning”, “Reiniging van de console”, die alle tekst uit het opdrachtpromptvenster wist:

>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()

Maar dit alles heeft niets te maken met wat ik probeer te bereiken, het maakt alle gebruikte objecten niet schoon.


Antwoord 1, Autoriteit 100%

U kunt individuele namen verwijderen met del:

del x

of je kunt ze verwijderen uit het globals()object:

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

Dit is slechts een voorbeeldlus; het verwijdert defensief alleen namen die niet beginnen met een onderstrepingsteken, waarbij een (niet onredelijke) veronderstelling wordt gemaakt dat u alleen namen zonder een onderstrepingsteken aan het begin in uw tolk hebt gebruikt. U kunt in plaats daarvan een hardgecodeerde lijst met namen gebruiken (whitelisting) als u echt grondig wilt zijn. Er is geen ingebouwde functie om het wissen voor u te doen, behalve gewoon de tolk afsluiten en opnieuw starten.

Modules die u heeft geïmporteerd (import os) blijven geïmporteerd omdat er naar wordt verwezen door sys.modules; volgende importen zullen het reeds geïmporteerde moduleobject hergebruiken. Je zult er alleen geen verwijzing naar hebben in je huidige globale naamruimte.

Python geeft echter geen veiligheidsgaranties over gegevens in het geheugen. Wanneer er niet langer naar objecten wordt verwezen, markeert de interpreter het geheugen als niet langer in gebruik, maar onderneemt geen stappen om dat geheugen te overschrijven om toegang tot gegevens te voorkomen. Als je dat beveiligingsniveau nodig hebt, moet je extensies van derden gebruiken die hun eigen geheugen beheren met het oog op beveiliging.


Antwoord 2, autoriteit 42%

Ja. Er is een eenvoudige manier om alles in iPython te verwijderen.
Typ in de iPython-console:

%reset

Het systeem zal u dan om bevestiging vragen. Druk op y.
Als u deze prompt niet wilt zien, typt u gewoon:

%reset -f

Dit zou moeten werken..


Antwoord 3, autoriteit 12%

U kunt python-vuilniscollector gebruiken:

import gc
gc.collect()

Antwoord 4, autoriteit 6%

Als je in een interactieve omgeving bent zoals Jupyterof ipython, ben je misschien geïnteresseerd in het wissen van ongewenste var’sals ze zwaar worden.

De magische commando’s reseten reset_selectivezijn beschikbaar op interactieve python-sessies zoals ipythonen Jupyter

1) reset

resetStelt de naamruimte opnieuw in door alle namen te verwijderen die door de gebruiker zijn gedefinieerd, indien aangeroepen zonder argumenten.

inen de outparameters geven aan of je de in/uit caches wilt leegmaken. De directorygeschiedenis wordt gewist met de parameter dhist.

reset in out

Een andere interessante is arraydie alleen numpy arrays verwijdert:

reset array

2) reset_selective

Reset de naamruimte door namen te verwijderen die door de gebruiker zijn gedefinieerd.
Invoer-/uitvoergeschiedenis wordt achtergelaten voor het geval je ze nodig hebt.

Clean Array-voorbeeld:

In [1]: import numpy as np
In [2]: littleArray = np.array([1,2,3,4,5])
In [3]: who_ls
Out[3]: ['littleArray', 'np']
In [4]: reset_selective -f littleArray
In [5]: who_ls
Out[5]: ['np']

Bron: http://ipython.readthedocs.io/en/stable/ interactief/magics.html


Antwoord 5, autoriteit 3%

Eigenlijk Python zal het geheugen terugvorderen dat niet meer in gebruik is. Dit wordt afvalcollectie genoemd die automatisch proces in Python is. Maar nog steeds als u het wilt doen, kunt u het verwijderen met del variable_name. U kunt het ook doen door de variabele toe te wijzen aan None

a = 10
print a 
del a       
print a      ## throws an error here because it's been deleted already.

De enige manier om het geheugen van ongename Python-objecten echt terug te winnen, is via de garbagecollector. Het DEL-trefwoord maakt eenvoudigweg een naam los van een object, maar het object moet nog steeds afval worden verzameld. U kunt de vuilniscollector dwingen het gebruik van de GC-module te gebruiken, maar dit is vrijwel zeker een voortijdige optimalisatie, maar het heeft zijn eigen risico’s. Met delheeft geen echt effect, aangezien deze namen zouden zijn verwijderd omdat ze toch buiten de ruimte gingen.


Antwoord 6, Autoriteit 2%

Dit werkte voor mij.

U moet het twee keer per keer uitvoeren voor globalen, gevolgd door de lokale bevolking

for name in dir():
    if not name.startswith('_'):
        del globals()[name]
for name in dir():
    if not name.startswith('_'):
        del locals()[name]

Antwoord 7

Dit zou de truc moeten doen.

globals().clear()

Other episodes