본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 파이썬 성능을 높이는 2가지 내부 메커니즘 : Integer 및 String Interning 작동 방식과 해결 방법

by Papa Martino V 2026. 2. 27.
728x90

Integer 및 String Interning 작동 방식
Integer 및 String Interning 작동 방식

 

파이썬(Python)은 초보자에게 친숙한 언어이지만, 그 내부를 들여다보면 메모리 효율성을 극대화하기 위한 정교한 설계가 숨어 있습니다. 그중 대표적인 것이 바로 인터닝(Interning)입니다. 이 글에서는 파이썬의 성능 최적화 핵심인 Integer Interning과 String Interning의 구체적인 작동 원리, 그리고 이를 통해 발생할 수 있는 논리적 오류의 해결 방법을 심층적으로 분석합니다.


1. 파이썬 인터닝(Interning)이란 무엇인가?

인터닝은 동일한 값을 가진 객체를 메모리상에 단 하나만 생성하여 공유하는 기술입니다. 새로운 객체를 매번 생성하는 대신, 이미 존재하는 객체의 참조(Reference)를 재사용함으로써 메모리 사용량을 줄이고 객체 비교 속도를 향상시킵니다. 파이썬에서는 주로 불변(Immutable) 객체인 정수와 문자열에 이 기법을 적용합니다.


2. Integer Interning: 작은 정수 캐싱의 비밀

파이썬(CPython 구현체 기준)은 프로그램 실행 시 빈번하게 사용되는 특정 범위의 정수를 미리 메모리에 할당해 둡니다. 이를 'Small Integer Caching'이라고도 부릅니다.

작동 범위와 원리

  • 범위: -5부터 256까지의 정수 ($[-5, 256]$).
  • 이유: 이 범위의 숫자들은 루프 인덱스, 리스트 인덱싱 등 프로그래밍 전반에서 가장 많이 사용되기 때문에 매번 생성하고 삭제하는 오버헤드를 줄이기 위함입니다.

범위에 따른 주소 비교 결과

구분 대상 값 비교 연산 (is) 메모리 주소 결과
범위 내 정수 100 True 동일한 메모리 주소 공유
범위 외 정수 257 False (원칙적) 새로운 객체 생성 및 할당

3. String Interning: 문자열 비교 최적화

문자열 인터닝은 정수보다 조금 더 복잡합니다. 모든 문자열이 자동으로 인터닝되는 것은 아니며, 주로 식별자(Identifier) 규칙을 따르는 문자열이 대상이 됩니다.

주요 특징

  • 컴파일 타임 인터닝: 소스 코드에 직접 입력된(Literal) 짧은 문자열이나 변수명, 함수명 등은 파이썬 컴파일러에 의해 자동으로 인터닝됩니다.
  • 런타임 생성: input()으로 받거나 실행 중에 조합된 문자열은 기본적으로 인터닝되지 않습니다.
  • 장점: 문자열 비교 시 ==(값 비교) 대신 is(주소 비교)를 사용할 수 있어 $O(n)$의 복잡도가 $O(1)$로 단축됩니다.

4. Interning 관련 주요 차이점 및 성능 비교

정수와 문자열 인터닝의 차이점을 표로 정리하면 다음과 같습니다.

특징 Integer Interning String Interning
자동 적용 범위 -5 ~ 256 (고정) 식별자 패턴, 컴파일 타임 상수
수동 제어 가능 여부 불가능 (C 소스 수정 필요) 가능 (sys.intern() 함수 사용)
주요 목적 빈번한 객체 생성 오버헤드 방지 메모리 절약 및 빠른 문자열 비교
가변성 불변(Immutable) 불변(Immutable)

5. Sample Example: 인터닝 작동 확인 및 해결 방법

다음은 실제 파이썬 인터프리터에서 인터닝이 어떻게 작동하는지 보여주는 코드 예시입니다.


import sys

# 1. Integer Interning 확인
a = 256
b = 256
print(f"256 is 256: {a is b}")  # True

c = 257
d = 257
print(f"257 is 257: {c is d}")  # False (인터프리터 환경에 따라 다를 수 있음)

# 2. String Interning 확인
s1 = "hello_world"
s2 = "hello_world"
print(f"Literal String: {s1 is s2}")  # True

# 3. 런타임 생성 문자열 해결 방법
s3 = "".join(['hello', '_', 'world'])
print(f"Runtime String: {s1 is s3}")  # False

# 해결 방법: sys.intern() 강제 사용
s4 = sys.intern("".join(['hello', '_', 'world']))
print(f"After sys.intern(): {s1 is s4}")  # True

6. 개발 시 주의사항 및 결론

인터닝은 성능 향상에 큰 도움을 주지만, "값의 동일성(==)""객체의 동일성(is)"을 혼동해서는 안 됩니다. 파이썬 버전이나 실행 환경(스크립트 실행 vs 대화형 셀)에 따라 인터닝 최적화 범위가 달라질 수 있으므로, 비즈니스 로직에서 값을 비교할 때는 반드시 == 연산자를 사용하는 것이 안전한 해결 방법입니다.


7. 내용의 출처

  • Python Software Foundation. "CPython Source Code: Objects/longobject.c"
  • Python Documentation. "sys.intern() — Object Management"
  • Fluent Python by Luciano Ramalho (O'Reilly Media)
  • High Performance Python by Micha Gorelick and Ian Ozsvald
728x90