파이썬/기본

[파이썬] 함수와 메모리

caramel-bottle 2023. 9. 11.

메모리 로드

함수 정의

  • 파이썬에서 함수는 객체로 취급된다.
  • 함수를 정의하면 해당 함수의 코드, 로컬변수, 매개변수 등이 메모리에 로드된다.
  • 함수가 호출되기 전에도 메모리상에 존재한다.

 

메모리 스택

  • 함수가 호출되면 함수 호출 스택이 생성된다.
  • 현재 실행중인 함수와 해당 함수의 로컬 변수, 매개변수를 저장하는 메모리 영역이다.
  • 호출될 때 로컬 변수 및 매개변수가 스택에 push된다.
  • 반환될 때 해당 변수들이 pop되어 스택에서 제거된다.
  • 함수 실행이 완료되면 스택이 해제된다.

 

변수 할당:

  • 파이썬의 함수는 일급 객체이다.
  • 함수를 다른 변수에 할당하면 그 변수는 원래의 함수 객체를 참조한다.
  • 하나의 함수에 여러 변수를 할당하면, 각 변수는 동일한 함수 객체를 참조한다.

 

* 일급 객체 ( First-Class Object )

1. 변수에 할당 가능

2. 인자로 전달 가능

3. 반환값으로 사용 가능

# 함수를 변수에 할당
def greet(name):
    return f"Hello, {name}"

say_hello = greet

# 함수를 다른 함수의 인자로 전달
def apply(func, value):
    return func(value)

result = apply(greet, "Alice")

# 함수를 반환값으로 사용
def get_greeter():
    return greet

greeter = get_greeter()

메모리 제거

참조 카운트

  • 파이썬의 메모리 관리는 참조 카운팅 기법에 기반한다.
  • 객체를 참조하는 변수나 요소의 카운트가 0이 되면 메모리에서 제거가 가능하다.

Garbage Collection

  • 참조 카운트가 0인 객체들은 바로 메모리에서 제거되지 않는다.
  • 가비지 컬렉터가 이런 객체들을 주기적으로 찾아 메모리에서 제거한다.

함수의 경우

  • 함수도 파이썬 객체이므로 참조 카운팅과 가비지 컬렉션의 원칙에 따라 동작한다.
  • 함수를 참조하는 변수나 요소가 없게 된다면 해당 함수는 가비지 컬렉터에 의해 메모리에서 제거될 수 있다.

명시적 제거

  • del 명령어로 함수에 대한 참조를 명시적으로 제거할 수 있다.
  • 즉시 메모리에서 제거되는 것은 아니다.

종료 시

  • 파이썬 프로그램이 종료될 때, 모든 메모리는 OS에 반환된다.
  • 함수와 관련된 모든 메모리도 함꼐 반환된다.
def my_function():
    print("Hello, World!")

del my_function
# 이후 my_function()을 호출하려고 하면 오류가 발생합니다.

 

 

* 파이썬 가비지 컬렉션 ( chatGPT )

 

파이썬의 가비지 컬렉션(Garbage Collection)은 자동 메모리 관리를 수행하는 메커니즘으로, 프로그램에서 더 이상 필요하지 않는 객체를 식별하고 제거하여 메모리 누수를 방지하는 역할을 합니다. 파이썬은 CPython 인터프리터를 기반으로 하며, CPython은 가비지 컬렉션을 내장하여 개발자가 명시적으로 메모리를 관리할 필요가 없도록 합니다. 파이썬의 가비지 컬렉션에 대한 주요 특징과 동작은 다음과 같습니다:

1. 참조 카운팅 (Reference Counting): 파이썬의 가비지 컬렉션은 참조 카운팅을 기본으로 사용합니다. 모든 객체는 참조 횟수(reference count)를 가지며, 객체가 다른 변수나 객체에 의해 참조될 때마다 참조 횟수가 증가하고, 참조가 끊길 때마다 감소합니다. 참조 횟수가 0이 되면 해당 객체는 더 이상 사용되지 않으므로 가비지 컬렉션에 의해 제거됩니다.

2. 순환 참조 검출 (Cycle Detection): 참조 카운팅만으로 해결할 수 없는 순환 참조 문제를 해결하기 위해 파이썬은 순환 참조 검출 알고리즘을 사용합니다. 이 알고리즘은 서로를 참조하는 객체 그룹을 식별하고, 해당 그룹을 해제하여 메모리 누수를 방지합니다.

3. 세대별 수집 (Generational Collection): 파이썬의 가비지 컬렉션은 세대별 수집을 사용하여 객체를 관리합니다. 객체는 새로 생성된 객체, 중간 수명 객체, 장기 수명 객체로 분류되고, 다른 가비지 수집 주기를 가지게 됩니다. 이렇게 함으로써 새로운 객체와 장기간 살아남은 객체를 효율적으로 관리할 수 있습니다.

4. 느긋한 가비지 컬렉션 (Lazy Garbage Collection): 파이썬의 가비지 컬렉션은 느긋한 방식으로 동작합니다. 쓰레기 수집이 필요한 시점까지는 수행되지 않고, 필요할 때만 가비지 컬렉션 프로세스가 실행됩니다.

5. `gc` 모듈: 파이썬의 가비지 컬렉션은 `gc` 모듈을 통해 직접 제어할 수 있습니다. 이 모듈을 사용하면 가비지 컬렉션 프로세스를 수동으로 트리거하거나 가비지 컬렉션 관련 정보를 조회할 수 있습니다.

가비지 컬렉션은 파이썬 프로그래머에게 메모리 관리 부담을 줄여주는 중요한 기능 중 하나입니다. 개발자는 대부분의 경우 가비지 컬렉션에 대해 걱정할 필요 없이 파이썬 코드를 작성하고 실행할 수 있습니다. 그러나 큰 데이터 구조나 특수한 상황에서 메모리 관리에 더 신경을 써야 할 수 있습니다.

 

 

'파이썬 > 기본' 카테고리의 다른 글

[파이썬] 콜백함수 & 람다함수  (0) 2023.09.14
[파이썬] 변수의 범위  (0) 2023.09.12
[파이썬] None  (0) 2023.09.11
[파이썬] 사용자 정의 함수  (0) 2023.09.11
[파이썬][응용]로또번호 추천 - random() 공부  (1) 2023.09.11

댓글