[Python]파이썬의 숨겨진 심장박동, 레퍼런스 카운팅

2024. 4. 15. 15:58· Language/Python
목차
  1. 레퍼런스 카운팅이란?

개요

  • 파이썬은 편리성과 강력함으로 많은 개발자에게 사랑받는 프로그래밍 언어입니다. 파이썬에서 편리함을 주는 기능들은 많이 있겠지만 자동적으로 진행되는 Garbage Collection(GC)도 하나의 큰 요소로 작용합니다.
  • 파이썬의 가비지 컬렉션(GC) 시스템은 자동으로 메모리 관리를 수행함으로써, 개발자가 프로그램의 복잡성에 신경 쓰지 않고 더 중요한 알고리즘 구현과 최적화에 집중할 수 있도록 도와줍니다. 이는 특히 메모리 관리가 필수적인 큰 프로젝트나 서비스에서 더욱 큰 장점으로 작용합니다.

해당 글은 이전 글인 ”파이썬은 모든 것이 객체?”를 보고 오시면 이해가 더 쉽습니다.

파이썬의 가비지 컬렉션 방식

  • 레퍼런스 카운팅(Reference Counting)
  • 마크-앤-스윕(Mark-and-Sweep)

위와 같이 파이썬 가비지 컬렉션 방식은 두 가지의 방식이 있지만 파이썬에서는 주로 래퍼런스 카운팅이 쓰이고, 보조적으로 마크 앤 스윕을 쓰인다고 합니다. 따라서 이번 글에서는 주로 쓰이는 레퍼런스 카운팅에 대해서 작성해보도록 하겠습니다.

레퍼런스 카운팅이란?

레퍼런스 카운팅은 객체가 몇 개의 참조(reference)를 갖고 있는지를 추적하는 방법입니다. 파이썬 내부에서는 모든 객체에 대해 참조 수를 관리하며, 이 참조 수가 0이 되는 순간 그 객체는 메모리에서 자동으로 해제됩니다.

import sys

# 객체 생성
a = []

# 1. a의 reference 카운트 확인
print(sys.getrefcount(a))
# 실행 결과 : 2

# 2. a에 대한 추가 reference 생성
b = a
print(sys.getrefcount(a))
# 실행 결과 : 3

# 3. reference 하나 제거
del b
print(sys.getrefcount(a))
# 실행 결과 : 2

위의 코드에서 실행한 결과를 확인해보면 a라는 객체를 생성한 후에 참조 카운트를 확인해보면 2라는 결과값을 확인해 볼 수 있습니다.

  1. 결과값이 2인 이유는 a라는 본인에 대한 참조와 getrefcount 라는 함수가 인자로 받은 객체에 대한 참조로 참조 수를 계산하는 동안만 존재하며 함수가 반환될 때 감소합니다.
  2. 여기서는 기존의 참조 값 + b가 a를 참조하는 값을 포함하여 3이라는 숫자가 반환됩니다.
  3. 마지막으로 b의 참조를 해제하고 확인해보면 처음 결과값 처럼 2라는 결과를 볼 수 있습니다.

정리

파이썬의 메모리 관리 시스템은 주로 레퍼런스 카운팅 방식을 사용하여 객체의 수명을 관리합니다. 이 방식의 기본 원리는 각 객체마다 참조 카운트를 유지하고, 이 카운트가 0이 될 때 해당 객체를 메모리에서 해제하는 것입니다.

하지만, 레퍼런스 카운팅 방식의 가장 큰 문제점으로 순환 참조(circular reference)를 처리하지 못한다는 문제가 있습니다. 따라서 순환 참조와 이를 처리하는 방식에 대해서 다음 글에서 설명드리겠습니다.

참고

https://devguide.python.org/internals/garbage-collector/index.html#memory-layout-and-object-structure

 

Garbage collector design

Abstract: The main garbage collection algorithm used by CPython is reference counting. The basic idea is that CPython counts how many different places there are that have a reference to an object. ...

devguide.python.org

 

저작자표시 비영리 (새창열림)

'Language > Python' 카테고리의 다른 글

[Python]GIL 너는 대체 머냐?  (0) 2024.04.15
[Python]리스트의 메모리 할당  (0) 2023.03.27
[Python]파이썬은 모든것이 객체?  (0) 2022.08.22
[Python] 함수 인자 전달 방식 - Call by assignment  (0) 2022.08.22
  1. 레퍼런스 카운팅이란?
'Language/Python' 카테고리의 다른 글
  • [Python]GIL 너는 대체 머냐?
  • [Python]리스트의 메모리 할당
  • [Python]파이썬은 모든것이 객체?
  • [Python] 함수 인자 전달 방식 - Call by assignment
hu-nie
hu-nie
잡다한거 정리해서 포스팅하는 블로그
hu-nie
내일을 위해
hu-nie
전체
오늘
어제
  • Contents (38)
    • CS (1)
      • Data Structure (0)
      • OS (1)
    • Language (8)
      • Python (5)
      • Coding Test (3)
    • Framework (1)
      • FastAPI (1)
    • Infra (2)
      • Docker (2)
      • k8s (0)
    • Project (1)
      • 짠내나는 쿠버네티스 서비스 구축기 (1)
    • Statistics (6)
      • ISLR 2nd Edition (4)
    • Review (5)
      • Seminar (2)
      • Paper (3)
    • 도메인 지식 (3)
      • DICOM (3)
    • 글또 (5)
    • etc (1)
    • TIL (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • coding test
  • pydicom
  • 통계학
  • Threshold segmentation algorithm
  • 완또하자
  • 글또
  • 글또 #글또7기 #
  • 다짐글
  • Paper Review
  • Statistical Learning
  • anomaly detection
  • Anatomicla Plane
  • DEVIEW 2019
  • 이상치 탐지
  • 메디컬딥러닝
  • 통계적 학습
  • 글또8기
  • ISLR
  • 글또 7기
  • AnoGAN
  • Deep learning
  • 딥러닝
  • Contanier
  • Brain MRA
  • Algorithm
  • 코딩테스트
  • greedy algorithm
  • cudnn
  • cuda toolkit
  • codingtest

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
hu-nie
[Python]파이썬의 숨겨진 심장박동, 레퍼런스 카운팅
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.