파이썬 Object Interning

파이썬 Object Interning

Interning이란 이미 생성된 객체(object)를 재사용(reuse)하는 것을 말하는데, 보통 Immutable 객체에 대해 Interning을 사용한다. 파이썬은 기본적으로 몇가지 제한된 경우에 대해 디폴트로 Interning을 사용하고 있으며, 또한 개발자가 필요한 경우 함수를 써서 Interning을 지정할 수도 있다.
아주 많이 사용되는 Immutable 객체의 경우 Interning을 사용하게 되면 메모리를 줄일 수 있는 효과가 있다.

파이썬 디폴트 Interning

파이썬은 기본적으로 몇가지 경우에 대해 시스템 디폴트로 Object Interning을 사용한다. 구체적으로 어떤 경우에 Interning을 사용하는가는 CPython, PyPy, Jython, IronPython 같은 각 구현체마다 다를 수 있지만, 기본이 되는 CPython의 경우 아래 조건에 해당될 경우 Object Interning을 사용한다.

  • 문자열: 20자 미만의 공백을 포함하지 않는 문자열
  • 정수: -5 부터 256 사이의 정수

예를 들어, 아래의 경우 처음 "Test" 문자열이 a 에 할당될 때, 이 문자열은 20자 미만 공백이 없는 문자열에 해당하므로 파이썬은 이 문자열을 Intern 컬렉션에 넣고 그 주소를 a 에 할당한다. 이 a 의 메모리 주소를 알기 위해 id(a)와 같이 함수 id() 를 사용하였다.
다음 b 에 문자열 "Test"를 할당할 때, 파이썬은 먼저 Intern 컬렉션에서 "Test"라는 문자열이 있는지 검색하고, 만약 있으면 그 메모리 주소를 b 에 할당한다. 하지만 만약 Intern 컬렉션에 해당 문자열이 없으면, 새로 Intern 컬렉션 안에 해당 문자열을 생성하고 그 주소를 b 에 할당한다.

a = "Test"   # string intern
b = "Test"   # string intern
x = id(a)
y = id(b)    # x,y 는 동일한 메모리 가리킴
print(x, y)  # 2611825223136 2611825223136

또 다른 예제로 정수의 경우를 들어보면, 아래의 i, j는 -5 ~ 256 사이의 정수로 자동으로 Interning이 사용되고, 동일한 메모리를 사용하게 된다. i is j 는 i 와 j가 동일한 객체를 가리키는지를 체크하는 표현이다. 아래 x,y 는 256을 초과했으므로 Interning 이 사용되지 않았고, 서로 다른 메모리에 할당되었다.

 
i = 10
j = 10
print(id(i), id(j), i is j) #2008444256 2008444256 True

x = 257
y = 257
print(id(x), id(y), x is y) #2611825055632 2611825055568 False

파이썬 intern() 함수

파이썬의 intern() 함수는 문자열을 Interning하는 함수이다. 개발자는 자주 사용되는 문자열을 intern() 함수를 사용하여 Intern 컬렉션에 저장해 놓고 사용할 수 있다. 파이썬 2 에서는 Built-in된 intern() 함수를 사용하고, 파이썬 3 에서는 sys 패키지의 intern() 함수를 사용한다.

from sys import intern  # Python 3

c = intern("Alex Lee")
d = "Alex Lee"
print(id(c), id(d), c is d) # 2987210077360 2987210078704 False

e = intern("Alex Lee")
print(id(c), id(e), c is e) # 2987210077360 2987210077360 True
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.