파이썬 딕셔너리의 내부 구조와 메모리 사용량
파이썬의 딕셔너리(dict)는 해시 테이블 기반으로 구현되어 있으며, 내부적으로 여러 개의 버킷(bucket)으로 이루어져 있습니다. 딕셔너리의 메모리 사용량을 이해하려면 먼저 각 버킷이 어떤 정보를 담고 있는지 알아야 합니다.
버킷 하나가 차지하는 메모리
각 버킷에는 다음과 같은 세 가지 정보가 저장됩니다.
- 저장된 객체의 해시 코드(hash code) — 충돌 해결(collision resolution) 전략 때문에 버킷의 위치만으로는 그 값을 예측할 수 없습니다.
- 키(key) 객체를 가리키는 포인터
- 값(value) 객체를 가리키는 포인터
이 세 가지 정보를 모두 합치면 버킷 하나는 최소한 32비트 시스템에서 12바이트, 64비트 시스템에서 24바이트를 차지하게 됩니다.
딕셔너리의 크기 조정(리사이징) 방식
딕셔너리는 처음 생성될 때 8개의 빈 버킷으로 시작합니다. 이후 저장된 항목 수가 용량에 도달하면 버킷 수를 두 배로 늘려 크기를 재조정(resize)합니다. 이러한 동적 확장 메커니즘 덕분에 딕셔너리는 데이터가 많아져도 평균 O(1)의 빠른 조회 속도를 유지할 수 있습니다.
실제 메모리 사용량 확인 방법
실제로 딕셔너리가 얼마나 많은 메모리를 사용하는지 확인하려면 sys.getsizeof() 함수를 활용할 수 있습니다. 다만 이 함수가 반환하는 값은 딕셔너리 구조 자체의 크기일 뿐, 키와 값으로 저장된 개별 객체들의 크기는 포함되지 않는다는 점에 유의해야 합니다.