본문 바로가기

파이썬의 정수 캐싱(Integer Caching) 메커니즘

오토씨 2025. 3. 12.

파이썬에서 정수 변수들의 ID를 비교할 때 특정 범위 내에서는 동일한 ID를 가지고, 그 범위를 벗어나면 서로 다른 ID를 갖는 현상이 발생합니다. 이는 파이썬의 최적화 기법인 '정수 캐싱(Integer Caching)' 또는 '정수 인터닝(Integer Interning)'으로 인한 결과입니다.

파이썬의 정수 캐싱(Integer Caching) 메커니즘



파이썬의 정수 캐싱 원리

파이썬(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를 반환합니다.

정수 캐싱의 목적

이러한 최적화 기법은 다음과 같은 이유로 도입되었습니다:

  1. 성능 향상: 작은 정수(-5~256)는 프로그래밍에서 자주 사용되므로, 이들을 미리 메모리에 로드해두면 성능이 향상됩니다.
  2. 메모리 효율성: 자주 사용되는 정수를 캐싱함으로써 메모리 사용을 최적화합니다.
  3. 빠른 비교 연산: 캐싱된 정수들은 ID 비교만으로 값의 동등성을 확인할 수 있어 비교 연산이 더 빠릅니다.

코드 컴파일 시 추가적인 최적화

파이썬 인터프리터는 대화형 모드에서와 컴파일된 코드에서 약간 다르게 동작할 수 있습니다. 컴파일된 코드에서는 컴파일러가 동일한 리터럴 값을 분석하여 동일한 객체로 병합하는 추가 최적화가 이루어질 수 있습니다. 이는 캐싱 범위를 벗어나는 정수에서도 동일한 ID를 가질 가능성이 있음을 의미합니다.

정수 캐싱은 CPython의 구현 세부사항이므로, 다른 Python 구현체(PyPy, Jython, IronPython 등)에서는 다르게 동작할 수 있습니다.

댓글