Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 가비지 컬렉션

<시간/>

Python 메모리 관리는 간단합니다. 메모리 할당 및 할당 해제가 자동으로 수행되므로 메모리 관리에 대해 걱정할 필요가 없습니다. 메모리 관리 메커니즘 중 하나는 가비지 수집입니다. 가비지 컬렉션의 다양한 측면을 이해해 보겠습니다.

쓰레기 수집

프로그램이 더 이상 해당 메모리를 필요로 하지 않을 때 실행 중인 프로그램이 현재 사용하고 있는 공유 컴퓨터 메모리를 정리하는 프로세스입니다. 가비지 컬렉션을 사용하면 해제된 메모리를 다른 프로그램에서 사용할 수 있습니다.

메모리 관리를 위해 파이썬에서 사용하는 두 가지 방법이 있습니다 -

  • 참조 카운팅
  • 쓰레기 수거

Python의 가비지 수집은 자동이지만 일부 프로그래밍 언어에서는 객체를 직접 정리해야 합니다. 파이썬에서 원하는 경우 수동으로 개체를 삭제할 수 있습니다.

>>> x = 9
>>> print(x)
9
>>> del x
>>> print(x)
Traceback (most recent call last):
   File "<pyshell#3>", line 1, in <module>
      print(x)
NameError: name 'x' is not defined

위에서 우리는 단순히 하나의 변수(x)를 정의하고 사용합니다. 런타임 동안 객체를 삭제하고(파이썬의 모든 것이 객체이기 때문에) 출력을 시도합니다.

위 프로그램의 처음 두 줄에서 객체 x가 알려져 있습니다. 그러나 객체(x)를 삭제한 후에는 더 이상 인쇄할 수 없습니다.

따라서 위에서 보면 가비지 수집이 완전히 자동화되어 있으며 이에 대해 걱정할 필요가 없음을 알 수 있습니다. 다른 예를 들어 위의 개념을 이해합시다. 위의 코드와 같이 파이썬의 모든 객체는 객체 x에는 참조 횟수와 유형에 대한 포인터가 있습니다.

참조 횟수 변경 값은 사용 방법에 따라 다릅니다. 예를 들어 개체 x를 다른 개체 y에 할당하면 참조 횟수가 2로 증가합니다.

>>> some_list = [1, 2 ,3, 4, 5, 6, 7, 8, 9]
>>> #Reference count of some_list = 1
>>> other_list = some_list
>>> #Reference count = 2
>>> #This will also increases if we pass the object as an assignment
>>> list_total = sum(some_list)
>>> # If we put the object in a list, reference count will also increase
>>> list_of_list = [some_list, some_list, some_list]
>>>
>>> #Let's check the reference count of object "some_list"
>>> import sys
>>> sys.getrefcount(some_list)
6

위는 파이썬에서 메모리 관리의 참조 카운팅을 이해하는 좋은 예입니다. 우리는 하나의 객체 "some_list"를 생성하고(참조 카운트 =1), 다른 객체에 할당하고(ref. count =2), 객체를 인수로 설정하고(ref. count =3) 나중에 객체를 다음 객체에 넣습니다. 개체의 발생이 3번인 목록(참조 횟수 =6). 나중에 "some_list" 개체의 참조 횟수를 얻으려고 하면 6이 됩니다.

>>> import sys
>>> sys.getrefcount(some_list)
6
>>>
>>> del list_of_list
>>> sys.getrefcount(some_list)
3
>>> del some_list
>>> sys.getrefcount(some_list)
Traceback (most recent call last):
   File "<pyshell#17>", line 1, in <module>
      sys.getrefcount(some_list)
NameError: name 'some_list' is not defined