Python/Advanced

[최적화] Python 인터닝(Interning) 기법

yubi5050 2024. 8. 3. 17:04

인터닝 (Interning)

인터닝(Interning) 은 동일한 값을 가진 불변 "객체"를 하나만 유지하여 메모리 사용을 최적화하고, 객체 비교를 빠르게 하는 기술

 

파이썬에서의 인터닝의 특징

  • 일정 길이의 문자열에 대해서 자동으로 인터닝이 적용된다.
  • 일정 크기의 숫자에 대해서 자동으로 인터닝이 적용된다.
  • 사용자가 sys.intern 으로 직접 인터닝 풀에 집어넣어 놓고 관리할 수 있다.
  • 일정 길이, 일정 크기는 cpython 즉 python 버전에 따라 다를 수 있다.
  • 주로 메모리 사용 최적화에 사용된다.

 

인터닝 예시 코드

# Python 언어의 자동 인터닝 o

# 문자열 
str1, str2 = 'abcdefg', 'abcdefg'

# id 함수는 객체가 메모리 내에 위치 반환
print(id(str1) == id(str2)) # True, 4332073584 4332073584

# 정수
a, b = 3, 3
print(id(a) == id(b)) # True

# 큰 정수 -> 일정 범위가 있음 (by CPython)
c, d = 181276378162378, 181276378162378
print(id(c)==id(d)) # False

# 리스트 join 과 str => 같은 값이지만 메모리 주소 다름
join_str3 = ''.join(['1','2','3'])
str3 = '123'
print(id(join_str3) == id(str3)) # False

# ====================================

# 수동 인터닝 - 생성 
import sys
join_str4 = sys.intern(''.join(['1','2','3']))
str4 = '123'
print(id(str4) == id(join_str4)) # True

# 인터닝 규칙에 의해 다음은 적용되지 않는다.
str4 = sys.intern('123')
join_str4 = ''.join(['1','2','3'])
print(id(str4) == id(list_str4)) # False

 

자바에서의 객체 인터닝

- 다른 문자열에 대해서 정수로 변환시 기본적으로 같은 메모리 주소를 바라봄.

https://cornswrold.tistory.com/265

결론

파이썬에서는 기본적으로 일부분만 인터닝을 해주지만, 내부 인터닝 적용 규칙에 따라 코드를 어떻게 작성하냐에 따라서도 많이 갈리는 것 같다.

나중에 메모리를 타이트하게 최적화 할일이 있을 때 살펴보는 것도 좋을 것 같고. 

만약 활용하게 된다면, 상수화(Constantization) 를 진행할 때 인터닝이 잘 활용 되도록 설계 해 보는 것도 좋을 것 같다.