인터닝 (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
자바에서의 객체 인터닝
- 다른 문자열에 대해서 정수로 변환시 기본적으로 같은 메모리 주소를 바라봄.
결론
파이썬에서는 기본적으로 일부분만 인터닝을 해주지만, 내부 인터닝 적용 규칙에 따라 코드를 어떻게 작성하냐에 따라서도 많이 갈리는 것 같다.
나중에 메모리를 타이트하게 최적화 할일이 있을 때 살펴보는 것도 좋을 것 같고.
만약 활용하게 된다면, 상수화(Constantization) 를 진행할 때 인터닝이 잘 활용 되도록 설계 해 보는 것도 좋을 것 같다.
'Python > Advanced' 카테고리의 다른 글
[requests] 라이브러리 Timeout 에러 분류 (0) | 2024.12.20 |
---|---|
[Python] 데이터 직렬화 및 검증 라이브러리 비교 (with 웹프레임워크) (0) | 2024.08.04 |
Python 코드 실행 과정 (0) | 2024.07.31 |
[Python] 모듈과 패키지 (0) | 2024.06.22 |
[Python] Class 이해 - 언더바 정의, @property, @staticmethod, setter/getter (0) | 2023.07.02 |