2014-06-24 5 views
1

저는 파이썬 객체의 메모리 할당에 대해 혼란스러워합니다. 사전 정의 된 유형의 할당이 일관되게 작동하지 않는 것 같습니다. ab에 대한파이썬 : 메모리 관리 최적화 불일치?

a = None 
b = None 
print(a, b is a) # it outputs True, one single instance of None 

a = 'a' 
b = 'a' 
print(a, b is a) # it outputs True, one single instance of a string 

a = 2 
b = 2 
print(a, b is a) # it outputs True, one single instance of an int 


a = 2.5 
b = 2.5 
print(a, b is a) # it outputs True, one single instance of a float 
        # from the python command line 'b is a' returns False 

a = 'a b' 
b = 'a b' 
print(a, b is a) # it outputs True, one single instances of the same string 
        # from the python command line 'b is a' returns False 

a =() 
b =() 
print(a, b is a) # it outputs True, one single instance of a() 

a = {} 
b = {} 
print(a, b is a) # it outputs False, two different instances of the same empty {} 

a = [] 
b = [] 
print(a, b is a) # it outputs False, two different instances of the same [] 

id 반환 값이 is 운영자가 제대로 작동하지만, '메모리 사용을 최적화'알고리즘이 일관성없이 작동하는 것 같군 보여 다음은 문제에 대한 내 cogitations의 제품입니다.

마지막 두 개의 print 출력과 파이썬 명령 줄 인터프리터 동작이 구현 버그를 드러내는가 아니면 Python이 그런 식으로 행동해야합니까?

OpenSUSE 13.1 env에서 테스트를 실행했습니다. 파이썬 2.7.6 및 파이썬 3.3.5 (기본, 3 월 27 일 2014, 17:16:46) [GCC] on linux.

명령 줄과 프로그램 간의 출력 차이를 제외하고 이러한 유형의 최적화가 필요한 이유는 무엇입니까? 저는 프로그래머가 직접 관리해야하는 특별한 경우를 고려하지 않는다면 평균 10 % 이상의 메모리를 절약 할 수 있다고 가정하는 것이 매우 낙관적 인 것이라고 생각합니다.

메모리 조각화를 효과적으로 최소화하려면이 동작이 도움이됩니까?

+0

항목 : http://stackoverflow.com/ q/15541404/3001761, http://stackoverflow.com/q/21203212/3001761. – jonrsharpe

답변

2

차이점은 단순히 이러한 개체 중 일부는 변경할 수 있고 일부는 변경할 수 없다는 점입니다.

예를 들어. 동일한 불변 객체에 대한 두 개의 참조가 아무런 문제를 일으키지 않기 때문에 문자열 리터럴을 사용해야합니다. 현재 위치에서 개체를 변경할 수 없으므로 변경 사항은 이전 개체와 별개로 새 개체를 의미합니다.

그러나 목록과 같이 변경 가능한 유형을 사용하면 a = b으로 설정하면 문제가 발생할 수 있습니다. 변경 가능한 개체는 내부에서 변경 될 수 있으므로 목록 예에서 a에 추가 된 항목은 b으로 끝나고 그 반대의 경우도 마찬가지입니다.

이러한 최적화가 수행되지 않습니다으로 인터프리터의 동작은, ("구금"하는 작은 정수를 제외한) 다른 :

>>> a = "a b" 
>>> b = "a b" 
>>> a is b 
False 
+1

'a = sys '를 사용하면 [sys.intern] (https://docs.python.org/3.0/library/sys.html#sys.intern)이라는 예제를 게시물에 추가 할 수 있습니다. 인턴 ('a b'); b = sys.intern ('a b')'이제'a is b'는 내부 문자열에 대해 True를 반환합니다. – dawg