Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 딕셔너리 메모리 사용량을 최적화하는 방법 총정리

Python의 딕셔너리(dict)는 강력하고 편리한 자료구조지만, 내부적으로 해시 테이블을 유지해야 하기 때문에 생각보다 많은 메모리를 소비합니다. 다행히 상황에 따라 딕셔너리 사용을 피하거나 더 가벼운 자료구조로 대체함으로써 메모리 사용량을 크게 줄일 수 있습니다.

1. 연속된 정수 키라면 리스트(list)를 사용하세요

키가 0, 1, 2처럼 연속적인 정수이고 각 키에 값을 매핑하는 딕셔너리를 만들려고 한다면, 굳이 딕셔너리를 사용할 필요가 없습니다. 이런 경우에는 리스트로 대체하는 것이 훨씬 효율적입니다.

# 딕셔너리 대신
d = {0: 'a', 1: 'b', 2: 'c'}

# 리스트로 대체
lst = ['a', 'b', 'c']
print(lst[0]) # 'a'

리스트는 인덱스를 통해 직접 접근하기 때문에 해시 계산과 버킷 관리 오버헤드가 없으며, 동일한 데이터를 저장할 때 딕셔너리보다 훨씬 적은 메모리를 사용합니다.

2. 문자열 키가 많다면 Trie(트라이) 자료구조를 고려하세요

문자열을 키로 사용하는 경우가 많다면 Trie(트라이) 자료구조를 활용해볼 수 있습니다. Trie는 문자열들의 공통 접두사(prefix)를 노드로 공유하는 트리 구조이기 때문에, 비슷한 접두사를 가진 문자열이 많을 때 딕셔너리보다 메모리를 크게 절약할 수 있습니다.

3. 메모리 부담이 적은 다른 자료구조로 대체하기

위 두 가지 외에도 딕셔너리를 다른 경량 자료구조로 대체할 수 있는 경우가 있습니다.

  • namedtuple / dataclass: 고정된 필드 집합을 저장할 때 딕셔너리 대신 사용하면 메모리 오버헤드가 줄어듭니다.
  • __slots__: 클래스 인스턴스의 속성을 저장할 때 __slots__를 선언하면 내부 딕셔너리 생성을 막아 메모리를 절약합니다.
  • 배열(array) 모듈: 동일 타입의 숫자 데이터를 다룰 때 리스트나 딕셔너리보다 효율적입니다.

그래도 딕셔너리가 필요한 순간

반면, 어떤 상황에서는 오히려 딕셔너리를 사용해야 최적화에 도움이 된다는 점을 이해해야 합니다. Python의 딕셔너리는 해시 테이블(hash table)을 비교적 단순하고 직관적으로 구현한 것으로, Java나 C++ 등 대부분의 프로그래밍 언어에서 해시 테이블을 구현하는 방식과 본질적으로 같습니다.

해시 테이블은 평균 O(1) 시간 복잡도로 키-값 조회를 제공하기 때문에, 빠른 검색 성능이 중요한 코드에서는 딕셔너리가 여전히 최선의 선택입니다. 즉, 메모리 절약과 조회 속도 사이의 균형을 고려해 상황에 맞는 자료구조를 선택하는 것이 핵심입니다.