Python의 Interning (Integer와 String)
1. Integer Optimization
a = 10
b = 10
를 선언했다고 가정하자.
분명히 integer는 primitive type 자료형이라 call by value로 동작해서 두 개의 id값이 달라야 할 것 같다.
그런데.. hex(id(a)) == hex(id(b)) # True가 출력된다.
어째서 True일까?
Python은 자주 사용하는 integer는 global scope에 미리 등록해두고 싱글톤처럼 사용한다.
(범위는 -5 ~ 256까지)
그래서 위 범위 내에서는 언제나 싱글톤처럼 동작하고 257부터는 객체 주소값이 달라지게 된다.
2. String optimization
파이썬은 자주 사용하는 Immutable한 객체는 인터닝한다.
# 인터닝이란, 자주 사용하는 객체의 재사용을 빠르게 하기 위해 시스템 상에 상수처럼 등록해놓는 것을 의미한다.
컴파일 시점에 변수명, 클래스명, 함수명은 인터닝 된다.
또한 강제로 sys.intern() 메소드를 사용하여 인터닝 할 객체를 강제 지정할 수 있다.
문자열의 경우엔 20자 미만의 공백을 포함하지 않는 문자열을 자동으로 인터닝한다.
a = 10
b = 10
를 선언했다고 가정하자.
분명히 integer는 primitive type 자료형이라 call by value로 동작해서 두 개의 id값이 달라야 할 것 같다.
그런데.. hex(id(a)) == hex(id(b)) # True가 출력된다.
어째서 True일까?
Python은 자주 사용하는 integer는 global scope에 미리 등록해두고 싱글톤처럼 사용한다.
(범위는 -5 ~ 256까지)
그래서 위 범위 내에서는 언제나 싱글톤처럼 동작하고 257부터는 객체 주소값이 달라지게 된다.
2. String optimization
파이썬은 자주 사용하는 Immutable한 객체는 인터닝한다.
# 인터닝이란, 자주 사용하는 객체의 재사용을 빠르게 하기 위해 시스템 상에 상수처럼 등록해놓는 것을 의미한다.
컴파일 시점에 변수명, 클래스명, 함수명은 인터닝 된다.
또한 강제로 sys.intern() 메소드를 사용하여 인터닝 할 객체를 강제 지정할 수 있다.
문자열의 경우엔 20자 미만의 공백을 포함하지 않는 문자열을 자동으로 인터닝한다.
댓글
댓글 쓰기