[python] 인터프리터의 메모리에서 생성 된 변수, 함수 등을 삭제하는 방법이 있습니까?

나는 며칠 동안이 질문에 대한 정확한 답을 찾고 있었지만 좋은 것을 얻지 못했습니다. 나는 프로그래밍의 완전한 초보자는 아니지만 아직 중급 수준은 아닙니다.

Python의 셸에있을 때 다음을 입력합니다. dir()현재 범위 (메인 블록)에있는 모든 개체의 모든 이름을 볼 수 있으며 그중 6 개가 있습니다.

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

그런 다음 예를 들어 변수를 선언 할 때 x = 10기본 제공 모듈 아래에있는 개체 목록에 자동으로 추가되고 다시 dir()입력하면 다음과 같이 표시됩니다 dir().

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

함수, 클래스 등도 마찬가지입니다.

처음에 사용 가능한 표준 6을 지우지 않고 모든 새 개체를 삭제하려면 어떻게해야합니까?

명령 프롬프트 창에서 모든 텍스트를 지우는 “메모리 정리”, “콘솔 정리”에 대해 여기에서 읽었습니다.

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

그러나이 모든 것은 내가 달성하려는 것과는 아무런 관련이 없으며 사용 된 모든 개체를 정리하지 않습니다.



답변

다음을 사용하여 개별 이름을 삭제할 수 있습니다 del.

del x

또는 globals()개체 에서 제거 할 수 있습니다 .

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

이것은 단지 예제 루프입니다. 그것은 방어 적으로 밑줄로 시작하지 않는 이름 만 삭제하고, 통역사에서 시작 부분에 밑줄이없는 이름 만 사용했다고 가정합니다. 정말로 철저히하고 싶다면 하드 코딩 된 이름 목록을 대신 보관 (화이트리스트) 할 수 있습니다. 인터프리터를 종료하고 다시 시작하는 것 외에는 지우기를 수행하는 내장 기능이 없습니다.

가져온 모듈 ( import os)은에서 참조하기 때문에 가져온 상태로 유지됩니다 sys.modules. 후속 가져 오기는 이미 가져온 모듈 객체를 재사용합니다. 현재 글로벌 네임 스페이스에는 참조가 없습니다.


답변

예. iPython에서 모든 것을 제거하는 간단한 방법이 있습니다. iPython 콘솔에서 다음을 입력하십시오.

%reset

그러면 시스템에서 확인을 요청합니다. y를 누릅니다. 이 프롬프트를 보지 않으려면 다음을 입력하십시오.

%reset -f

작동합니다 ..


답변

Python 가비지 수집기를 사용할 수 있습니다.

import gc
gc.collect()


답변

대화 형 환경에 Jupyter있거나 원하지 않는 var 가 무거워지면 삭제하는ipython 데 관심이있을 수 있습니다 .

마법-명령 resetreset_selective같은 대화 형 파이썬 세션에 vailable이다 ipython하고Jupyter

1) reset

reset 인수없이 호출 된 경우 사용자가 정의한 모든 이름을 제거하여 네임 스페이스를 재설정합니다.

in그리고 out매개 변수를 사용하면 IN / OUT 캐시를 플러시할지 여부를 지정합니다. 디렉토리 기록은 dhist매개 변수 로 플러시됩니다 .

reset in out

또 다른 흥미로운 array점은 numpy 배열 만 제거한다는 것입니다 .

reset array

2) 재설정 _ 선택적

사용자가 정의한 이름을 제거하여 네임 스페이스를 재설정합니다. 필요한 경우 입력 / 출력 기록이 남아 있습니다.

깨끗한 어레이 예 :

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']

출처 : http://ipython.readthedocs.io/en/stable/interactive/magics.html


답변

이것은 나를 위해 일했습니다.

전역 및 로컬에 대해 한 번 실행해야합니다.

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

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


답변

사실 파이썬은 더 이상 사용하지 않는 메모리를 회수하는데 이것을 파이썬에서 자동으로 처리하는 가비지 콜렉션 이라고 합니다. 하지만 그래도 원하는 경우 del variable_name. 변수를 다음에 할당하여 수행 할 수도 있습니다.None

a = 10
print a

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

참조되지 않은 Python 객체에서 실제로 메모리를 회수하는 유일한 방법은 가비지 수집기를 사용하는 것입니다. del 키워드는 단순히 개체에서 이름의 바인딩을 해제하지만 개체는 여전히 가비지 수집되어야합니다. gc 모듈을 사용하여 가비지 수집기를 강제로 실행할 수 있지만 이는 거의 확실하게 조기 최적화이지만 자체 위험이 있습니다. del어차피 범위를 벗어나면 이름이 삭제 되었기 때문에 사용 은 실제 효과가 없습니다.


답변