Object Interning

kkiyou·2021년 5월 21일
0

Python

목록 보기
9/12

Interning

파이썬은 메모리의 효율적인 사용을 위해 특정한 문자 영역의 값을 동일한 메모리 주소값에 할당한다. 특정한 문자 영역의 값은 다음과 같다.

  • -5 ~ 256 범위의 정수

    y = -7
    for x in range(-7, 260):
        if x is not y:
            print("id(%3s): %s  id(%3s): %s" %(x, id(x), y, id(y)))
            print(id(x) - id(y))
        y = y + 1
    id( -7): 140475708734192  id( -7): 140475710813008
    -2078816
    id( -6): 140475710813008  id( -6): 140475710812528
    480
    id(257): 140475710813008  id(257): 140475708734192
    2078816
    id(258): 140475708734192  id(258): 140475710813136
    -2078944
    id(259): 140475710813136  id(259): 140475710813264
    -128
  • [a-zA-Z0-9_]에 해당하는 char가 연결된 문자열

    # [a-zA-Z0-9_]에 해당하는 랜덤한 문자열의 조합 st1을 반환한다.
    iimport random
    rand = str()
    for _ in range(50):
        rand = rand + random.choice("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_")
    
    # 만들어진 랜덤한 문자열의 조합을 확인한다.
    >>> print("rand: %s" %(rand))
    QcsirWWJGjcEvdD2bBtxWE_spCjwr3xdCSwBEyYXz3rkSb5lVN
    >>> print("id(rand): %s" %(id(rand)))
    id(rand): 140475710842000
    
    # 만들어진 랜덤한 문자열의 조합을 새로운 변수 st1과 st2에 할당한다.
    st1 = "QcsirWWJGjcEvdD2bBtxWE_spCjwr3xdCSwBEyYXz3rkSb5lVN"
    st2 = "QcsirWWJGjcEvdD2bBtxWE_spCjwr3xdCSwBEyYXz3rkSb5lVN"
    
    # 같은 메모리 영역을 가리키고 있는 것을 확인할 수 있다.
    >>> print("id(st1): %s" %(id(st1)))
    id(st1): 140475710819776
    >>> print("id(st2): %s" %(id(st2)))
    id(st2): 140475710819776
    
    
    # 반면 띄어쓰기나 다른 특수문자가 들어간 문자열의 조합은 서로 다른 메모리 주소값에 저장되어 있음을 알 수 있다.
    a = "Hello, world!"
    b = "Hello, world!"
    
    >>> print("id(a): %s" %(id(a)))
    140475708991408
    >>> print("id(b): %s" %(id(b)))
    140475708989616

그런데 위의 규칙 외에도 같은 메모리 주소값을 가리킬 수 있다. 아래 예를 보자. 컴파일 시점에서 동일한 값임을 알고 있기 때문에 컴파일러는 서로 다른 두 변수를 같은 메모리 주소값에 할당하게 된다.(Jupyter Notebook에서는 다른 메모리 주소값을 반환한다. 아래는 IDLE에서 실행한 결과이다.)

a = "Hello, world!"; b = "Hello, world!"

>>> print("id(a): %s" %(id(a)))
4361010032
>>> print("id(b): %s" %(id(b)))
4361010032

참고자료 1 참고자료 2

0개의 댓글