Python

python object interning

Prower 2022. 7. 22. 02:34
728x90
반응형
  • python에서는 메모리 효율을 높이기 위해 object interning이란 기법을 사용한다
  • object interning: python에서 immutable한 객체에 한해 동일한 값을 하나만을 메모리공간에 저장하여 효율적으로 메모리를 관리하는 방식

string의 경우

>>> a = "hello"
>>> b = "hello"
>>> a is b
True
  • a와 b는 같은 값이지만 다른 변수에 할당되었으므로 다른 reference를 참조하고 있는 것으로 봐야한다.
  • 하지만, object interning에 의해 "hello"라는 값은 하나의 메모리 공간에 저장되고 a와 b는 해당 메모리 공간을 참조한다.
>>> id(a)
4300925552
>>> id(b)
4300925552
  • 다만 다음과 같이 특수 문자나 공백이 포함되면 다른 메모리 공간을 참조하게 된다.
>>> a = "hello!"
>>> b = "hello!"
>>> a is b
False

int의 경우

>>> b = 1
>>> a = 1
>>> a is b
True
​
>>> a = 257
>>> b = 257
>>> a is b
False
  • 위 케이스에서 정수 1은 interning이 되어있어 하나의 메모리 공간에 저장되고 변수 a, b는 같은 메모리 공간을 참조한다
  • 정수 257은 interning이 되어있지 않으므로 다른 메모리 공간에 저장되고 a, b 는 다른 메모리 공간을 참조하여 reference 비교에서 false를 반환한다.

interning의 기준

  • 위 케이스를 보면 모든 값에 대해서 object interning이 되는 건 아닌 것 같다.
  • python 구현체 마다 다르지만 cpython에서는 기본적으로 python이 실행될 때
    • 정수 -5 ~ 256
    • 특수문자나 공백이 포함되지 않은 20자 이내의 string
  • 은 기본적으로 interning이 된다.

IDE에서

  • 위 케이스는 모두 REPL에서 실행한 결과이다 vscode에서도 동일하게 작동하는지 확인해본다
a = 99999
b = 99999
​
print(a is b)
​
foo = "hello!"
bar = "hello!"
​
print(foo is bar)
​
>
True
True
  • 257 이상의 정수와 특수문자가 포함된 string을 할당했는데도 같은 reference를 참조하는 것으로 보인다.
  • REPL의 경우에는 코드를 한줄씩 읽어 동일한 값이 할당된 다른 변수가 같은 값을 갖는지 알지 못해 interning이 발생하지 않는다.
  • 다만 python interpreter로 실행시 이를 알 수 있기 때문에 interning을 발생시켜 동일한 메모리에 할당한다.

연산의 경우

a = 10000
b = 10000+1
​
print(a is b)
​
>
False
  • 연산의 경우에는 컴파일을 하더라도 각 변수가 같은 값을 갖는 것이 확정되는것이 아니므로 다른 reference를 참조하는 것으로 처리한다.
728x90
반응형