본문 바로가기
파이썬 관련 문법

불변성이 가져오는 이점: 파이썬 튜플의 효율적인 메모리 관리

by arctis7p 2024. 12. 10.

파이썬에서 튜플(Tuple)은 불변(immutable)한 시퀀스 자료형으로, 리스트와 유사하지만 몇 가지 중요한 차이점이 있습니다. 튜플의 사용과 메모리 최적화에 대해 자세히 알아보겠습니다.

 

튜플의 특징과 사용

튜플은 소괄호 ()를 사용하여 생성하며, 요소들은 쉼표로 구분합니다.

my_tuple = (1, 2, 3, 'a', 'b')

 

튜플의 주요 특징은 다음과 같습니다.

  1. 불변성: 한 번 생성된 튜플은 변경할 수 없습니다.
  2. 인덱싱과 슬라이스: 리스트와 마찬가지로 인덱싱과 슬라이싱이 가능합니다.
  3. 패킹과 언패킹: 여러 값을 하나의 튜플로 묶거나 튜플의 요소를 개별 변수로 분리할 수 있습니다.

 

튜플과 메모리 최적화

튜플은 리스트에 비해 메모리 사용량이 적고, 처리 속도가 빠르다는 장점이 있습니다. 왜 그런 걸까요?

  1. 불변성: 아까 설명했듯이 튜플은 변경할 수 없는 불변(immutable)한 객체이기 때문에, 파이썬은 메모리를 더 효율적으로 관리할 수 있습니다.
    1. 고정된 크기: 튜플은 생성 시 크기가 고정되므로, 파이썬은 정확히 필요한 만큼의 메모리만 할당합니다. 반면 리스트는 가변적이므로 추가 공간을 미리 할당합니다. 튜플은 변경될 수 없기에 내부 구조가 더 단순합니다. 이로 인해 메모리 사용량이 줄어들고 접근 속도가 빨라집니다.
    2. 튜플이 불변이라서 새로운 객체를 만들어야 한다는 점은 맞습니다. 하지만 이것이 반드시 더 많은 메모리를 사용한다는 의미는 아닙니다.
  2. 튜플 캐싱: 파이썬은 작은 크기의 튜플을 메모리에 캐시(저장)하여 재사용합니다. 이는 성능 향상과 메모리 효율성을 위한 최적화 기법입니다. 작동 방법을 알아보겠습니다.
    1. 작은 튜플 생성: 프로그램에서 작은 크기의 튜플(일반적으로 20개 이하의 요소를 가진 튜플)을 생성할 때, 파이썬을 이를 특별한 메모리 영역에 저장합니다.
    2. 재사용: 동일한 내용의 튜플이 다시 필요할 때, 파이썬은 새로운 메모리를 할당하지 않고 이미 저장된 튜플을 재사용합니다.
    3. 메모리 효율성: 이 방식으로 동일한 튜플에 대해 반복적으로 메모리를 할당하고 해제하는 과정을 줄일 수 있습니다.
      a = (1, 2)
      b = (1, 2)
      print(id(a), id(b)) #2070272464768 2070272464768 동일하게 출력
       이 예시에서 a와 b는 동일한 메모리 주소를 가리킵니다. 파이썬이 두 번째 튜플을 생성할 때 이미 캐시 된 튜플을 재사용했기 때문입니다.
import sys

list_data = [1, 2, 3, 4, 5]
tuple_data = (1, 2, 3, 4, 5)

print(sys.getsizeof(list_data))  # 리스트의 메모리 사용량, 104가 출력됩니다.
print(sys.getsizeof(tuple_data))  # 튜플의 메모리 사용량, 80이 출력됩니다.

 추가적으로 이 코드를 실행하면 80의 메모리 사용량을 가지는 튜플이 104의 메모리 사용량을 가지는 리스트보다 작다는 것을 확인할 수 있습니다.

 


 

그럼 튜플을 사용해야 하는 경우를 알아봅시다.

  1. 불변 데이터 표현: 변경되지 않아야 하는 데이터를 저장할 때 튜플을 사용합니다. ex) 좌표, 개인 정보, 설정 값 등
  2. 딕셔너리 키: 튜플은 해시 가능하므로 딕셔너리의 키로 사용할 수 있습니다.
  3. 함수의 반환값: 여러 값을 반환할 때 튜플을 사용하면 편리합니다.
  4. 네임드 튜플: collections 모듈의 namedtuple을 사용하여 필드에 이름을 부여할 수 있습니다.

결론적으로 튜플은 파이썬에서 메모리를 효율적으로 사용하고 성능을 최적화하는데 도움이 되는 중요한 자료구조입니다. 불변성, 적은 메모리 사용량, 해시를 이용한 빠른 접근 속도 등의 특징으로 인해 적절한 상황에서 튜플을 사용하면 프로그램의 효율성을 높일 수 있습니다.

 

 

# 이 글의 내용 중 일부는 Perplexity AI의 도움을 받아 정보를 수집하고 정리하였으며, 추가적인 연구와 개인적인 견해를 더하였습니다.