2013-09-04 2 views
1

CPython은 이전에 동일한 불변 객체의 단일 사본을 저장하는 경우가 있습니다.CPython - 모든 불변 객체를 인쇄하십시오.

>>> a = "hello" 
>>> b = "hello" 
>>> a is b 
True 

>>> a, b = 7734, 7734 
>>> a is b 
True 

내가 힙이 유형의 추론

>>> a, b = 7734, 07734 
>>> a is b 
False 

>>> a, b = 7734, 017066 
>>> a is b 
True 

후 수행한다고 가정 무엇에 대한 해시 인터프리터를 성찰하고 불변의 객체의 가정 힙을 인쇄 할 수있는 방법이있는 것 같습니다?

+1

두 번째 예에주의하십시오. '07734 == 4060'이므로 '07734'는 '7734'가 아닙니다. – DSM

+0

아, 8 진수 속기를 잊어 버렸습니다 ... – user213397

+0

'locals()를 사용하는 것이 잘못된 이유는 무엇입니까? 또는 당신의 경우에'[None, , 7734, '__main __']]'같은 것을 인쇄 할'list (set (locals(). values ​​()))'' –

답변

8

인체 개체는 일정 범위의 위치에서 유지 관리되지 않으며 해당 개체를 모두 나열 할 수있는 방법이 없습니다.

  • 검색 한대로 문자열을 인턴 트할 수 있으며 intern() function을 사용하여 문자열을 인턴트 할 수 있습니다.
  • -5에서 256 사이의 작은 정수는 허용되지 않습니다.
  • 튜플이 재사용됩니다. 비어있는 튜플 (())은 싱글 톤이며 튜플 크기 1에서 20까지 2000 개가 재활용을 위해 캐싱됩니다. (그냥 튜플 개체가 아니라 내용).
  • NoneEllipsis, NotImplemented, TrueFalse과 같이 싱글 톤입니다.
  • 파이썬 3.3에서 인스턴스 __dict__ 사전은 share keys으로 메모리에 저장할 수 있습니다.
  • 컴파일러는 불변의 (그리고 상황에 따라 가변적 인) 소스 코드 리터럴을 상수로 표시하고, 바이트 코드와 함께 저장하고 바이트 코드가 실행될 때마다 다시 사용할 수 있습니다. 이는 문자열, 숫자, 튜플, 목록 (in 문과 함께 사용 된 경우) 및 as of Python 3.2 집합 (다시 말하면 in과 함께 사용되는 경우)에 적용됩니다.

아직 더 이상 발견하지 못했을 수 있습니다.

이러한 최적화는 모두 너무 많은 힙 변동을 피하는 데 도움이됩니다. 그리고 None을 제외하고는 Ellipsis, NotImplemented, TrueFalse은 모두 싱글 톤입니다. 이들은 모두 CPython에 특정한 최적화이며, 파이썬 언어 정의 그 자체가 아닙니다.

+0

안녕하세요. 그 의미는 무엇입니까? "'튜플 객체 만, 내용이 아닙니다 .'' 제발요. – eyquem

+0

@eyquem : 튜플을 생성 할 때 C 코드는 힙에서 하나를 선택하고 내용을 다시 할당합니다. 튜플은 파이썬에서만 불변이며, C 코드는 여전히 새로운 내용을 할당 할 수 있습니다. 그래서 튜플'(1, 2)'이 더 이상 사용되지 않을 때, 다른 파이썬 객체에 대한 참조없이 (각 슬롯에 널 포인터가 없기 때문에)'(null, null)'객체 만 캐시됩니다. –

+0

감사합니다. 그 모든 것을 몰랐습니다. 나는 당신이 그것을 배운 곳에서 궁금해. 나는 upvote – eyquem

3

당신이 그것을 만드는 것보다 조금 더 복잡합니다. 예를 들어, 큰 정수가있는 예제에서는 동일한 표현식의 일부가 아닌 경우 이 아닌이 다시 사용됩니다.

>>> a = 7734 
>>> b = 7734 
>>> a is b 
False 

첫 번째 예제에서 보여 주듯이, 이것은 문자열로 작동하지만 모든 문자열이 아닙니다.

>>> a = "this string includes spaces" 
>>> b = "this string includes spaces" 
>>> a is b 
False 

다음 개체는 기본적으로 실제로는 안됨 : 작은 정수, 빈 터플 및 파이썬 식별자와 비슷한 문자열. 큰 정수 및 기타 변경 불가능한 객체로 보는 것은 동일한 표현식에서 사용되고 있다는 사실로 인해 최적화됩니다.

관련 문제