파이썬의 정수 캐싱(Integer Caching) 메커니즘
파이썬에서 정수 변수들의 ID를 비교할 때 특정 범위 내에서는 동일한 ID를 가지고, 그 범위를 벗어나면 서로 다른 ID를 갖는 현상이 발생합니다. 이는 파이썬의 최적화 기법인 '정수 캐싱(Integer Caching)' 또는 '정수 인터닝(Integer Interning)'으로 인한 결과입니다.
파이썬의 정수 캐싱 원리
파이썬(CPython 구현체)은 -5부터 256까지의 정수를 메모리에 미리 캐싱합니다. 이 범위 내의 정수는 인터프리터가 시작될 때 미리 메모리에 로드되어 재사용됩니다. 동일한 값을 가진 변수들은 실제로는 메모리 내의 동일한 객체를 참조하게 됩니다.
a = 1
b = 1
id(a) == id(b) # True (1은 캐싱 범위 내)
c = 100
d = 100
id(c) == id(d) # True (100은 캐싱 범위 내)
e = 1000
f = 1000
id(e) == id(f) # False (1000은 캐싱 범위 외)
정수 캐싱의 구현 방식
CPython 구현에서는 PyLong
타입이 초기화될 때 -5부터 256까지의 정수를 small_ints
라는 배열에 미리 저장합니다. 사용자가 이 범위 내의 정수를 선언하거나 사용할 때, 새로운 메모리를 할당하는 대신 이미 캐싱된 객체를 반환합니다.
Python에서 is
연산자는 두 변수가 메모리 상의 동일한 객체를 가리키는지 확인합니다. 캐싱된 범위 내의 정수는 동일한 객체를 참조하므로 is
연산자로 비교하면 True
를 반환합니다.
정수 캐싱의 목적
이러한 최적화 기법은 다음과 같은 이유로 도입되었습니다:
- 성능 향상: 작은 정수(-5~256)는 프로그래밍에서 자주 사용되므로, 이들을 미리 메모리에 로드해두면 성능이 향상됩니다.
- 메모리 효율성: 자주 사용되는 정수를 캐싱함으로써 메모리 사용을 최적화합니다.
- 빠른 비교 연산: 캐싱된 정수들은 ID 비교만으로 값의 동등성을 확인할 수 있어 비교 연산이 더 빠릅니다.
코드 컴파일 시 추가적인 최적화
파이썬 인터프리터는 대화형 모드에서와 컴파일된 코드에서 약간 다르게 동작할 수 있습니다. 컴파일된 코드에서는 컴파일러가 동일한 리터럴 값을 분석하여 동일한 객체로 병합하는 추가 최적화가 이루어질 수 있습니다. 이는 캐싱 범위를 벗어나는 정수에서도 동일한 ID를 가질 가능성이 있음을 의미합니다.
정수 캐싱은 CPython의 구현 세부사항이므로, 다른 Python 구현체(PyPy, Jython, IronPython 등)에서는 다르게 동작할 수 있습니다.
'dev > Python' 카테고리의 다른 글
파이썬의 'del' 키워드 완벽 이해하기 (0) | 2025.04.08 |
---|---|
파이썬에서 is와 == 연산자의 차이점 이해하기 (0) | 2025.03.12 |
Python 패키지 관리의 혁신 - uv 소개 (0) | 2024.11.08 |
딕셔너리에서 삭제하기 (0) | 2022.03.08 |
defaultdict (0) | 2022.03.04 |
댓글