Od kilku dni szukam dokładnej odpowiedzi na to pytanie, ale nie mam nic dobrego. Nie jestem całkowitym początkującym w programowaniu, ale nie jestem jeszcze na poziomie średniozaawansowanym.
Kiedy jestem w powłoce Pythona, piszę: dir()
i widzę wszystkie nazwy wszystkich obiektów w bieżącym zakresie (głównym bloku), jest ich 6:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Następnie, kiedy deklaruję zmienną, na przykład x = 10
, automatycznie dodaje do listy obiektów pod wbudowanym modułem dir()
, a kiedy piszę dir()
ponownie, pokazuje teraz:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
To samo dotyczy funkcji, klas i tak dalej.
Jak usunąć wszystkie te nowe obiekty bez wymazywania standardu 6, który był dostępny na początku?
Czytałem tutaj o „czyszczeniu pamięci”, „czyszczeniu konsoli”, które usuwa cały tekst z okna wiersza poleceń:
>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
Ale to wszystko nie ma nic wspólnego z tym, co próbuję osiągnąć, nie usuwa wszystkich używanych obiektów.
źródło
del
funkcja. Zaczynam się uczyć Pythona i często muszę eksperymentować z powłoką, więc standardowe nazwy zmiennych, takie jakx
luby
często są już w użyciu, a ponowne uruchomienie powłoki zajmuje kolejne 15 sekund (mam teraz bardzo, bardzo stary laptop). Chciałem więc znaleźć sposób na szybsze wyczyszczenie pamięci Pythona.del
nie jest dokładnie funkcją, stąd nie(
i)
. To słowo kluczowe, które wprowadza instrukcję del. Oczywiście, sposób, w jaki faktycznie usuwa obiekt, może wiązać się z funkcjami, ale to już inna historia ...x
luby
nie powinny być używane, chyba że ich używasz. Lub jeśli nie zrobisz czegoś głupiegofrom _somemodule_ import *
, wtedy będziesz miał wszelkiego rodzaju śmieci zaśmiecające to miejsce. :)Odpowiedzi:
Możesz usunąć poszczególne nazwy za pomocą
del
:lub możesz je usunąć z
globals()
obiektu:To jest tylko przykładowa pętla; defensywnie usuwa tylko nazwy, które nie zaczynają się od podkreślenia, przyjmując (nie bez powodu), że użyłeś tylko nazw bez podkreślenia na początku w swoim tłumaczu. Zamiast tego możesz użyć zakodowanej na stałe listy nazwisk (umieszczenie na białej liście), jeśli naprawdę chcesz być dokładny. Nie ma wbudowanej funkcji, która mogłaby wykonać czyszczenie za Ciebie, poza wyjściem i ponownym uruchomieniem interpretera.
Zaimportowane moduły (
import os
) pozostaną zaimportowane, ponieważ odwołuje się do nichsys.modules
; kolejne importy wykorzystają już zaimportowany obiekt modułu. Po prostu nie będziesz mieć do nich odniesienia w swojej obecnej globalnej przestrzeni nazw.źródło
startswith('_')
wydaje się dość naiwny. Jeśli ktoś jest wystarczająco sprytny, aby pisać,_foo=42
a nawet__foo__=42
, jak możemy je usunąć? Czy istnieje sposób na programowe uzyskanie nazw standardowych właściwości modułów?dir(ModuleType())
, ale to tylko wracadoc
iname
.Tak. Istnieje prosty sposób na usunięcie wszystkiego w iPythonie. W konsoli iPython wystarczy wpisać:
Następnie system poprosi o potwierdzenie. Naciśnij y. Jeśli nie chcesz widzieć tego monitu, po prostu wpisz:
To powinno działać ..
źródło
Możesz użyć garbage collectora w Pythonie:
źródło
Jeśli jesteś w środowisku interaktywnym, takim jak
Jupyter
lubipython
możesz być zainteresowany usuwaniem niechcianych zmiennych, jeśli stają się one ciężkie.Magiczne polecenia
reset
ireset_selective
są dostępne w interaktywnych sesjach Pythona, takich jakipython
iJupyter
1)
reset
in
aout
parametry określają, czy chcesz opróżnić bufory wejścia / wyjścia. Historia katalogów jest opróżniana zdhist
parametrem.Innym interesującym jest to,
array
że usuwa tylko numpy Arrays:2) reset_selective
Przykład czystej tablicy:
Źródło: http://ipython.readthedocs.io/en/stable/interactive/magics.html
źródło
To zadziałało dla mnie.
Musisz uruchomić go dwa razy dla globalnych, a następnie lokalnych
źródło
W rzeczywistości Python odzyska pamięć, która nie jest już używana. Nazywa się to zbieraniem śmieci, co jest procesem automatycznym w Pythonie. Ale nadal, jeśli chcesz to zrobić, możesz to usunąć przez
del variable_name
. Możesz to również zrobić, przypisując zmienną doNone
Jedynym sposobem, aby naprawdę odzyskać pamięć z obiektów Pythona, do których nie istnieją odniesienia, jest użycie modułu odśmiecania pamięci. Słowo kluczowe del po prostu odłącza nazwę od obiektu, ale obiekt nadal musi zostać usunięty. Możesz zmusić garbage collectora do uruchomienia przy użyciu modułu gc, ale jest to prawie na pewno przedwczesna optymalizacja, ale ma swoje własne ryzyko. Użycie
del
nie ma rzeczywistego efektu, ponieważ te nazwy i tak zostałyby usunięte, ponieważ i tak wyszłyby poza zakres.źródło
del
nie mają rzeczywisty wpływ tutaj.