2016-12-25 11 views
3

개체의 메모리 크기는 sys.getsizeof으로 가져올 수 있습니다.Python - 중첩 된 빈 목록의 메모리 크기

[]의 크기는 [[]] 크기보다 작을 수 있습니다. 내 컴퓨터에, 나는 다음과 같은 크기 얻을 : 지금

>>> sys.getsizeof([]) 
36 
>>> sys.getsizeof([[]]) 
40 

을 어떤 I, 나는 항상 같은 크기를 얻을 수있는 중첩 된 빈리스트의 수 : 이유는 무엇

>>> sys.getsizeof([[[]]]) 
40 
>>> sys.getsizeof([[[[]]]]) 
40 

왜 크기 중첩 된 빈 목록 중 상위 경계가있는 것 같습니다. getsizeof를 호출 할 때 the documentation 읽기

+7

당신이 [문서]를 읽을나요 (https://docs.python.org/3/library/sys.html#sys.getsizeof), 구체적으로 예를 들어, "객체에 직접적으로 기여한 메모리 소비 만 차지하고 그것이 말하는 객체의 메모리 소비가 아니라"라고 말한 부분. – BrenBarn

+0

@ BrenBarn 사실 나는 그렇지 않았고 내 질문에 답합니다. 고맙습니다! –

+0

http://stackoverflow.com/a/30316760/533399 – DhruvPathak

답변

3

는 개체에 직접 기인

만 메모리 소비는 의 개체가 아닌 메모리 소비가에 의미를 차지하다는 것을 가르쳐 것입니다. [] 이후

getsizeof에 따른 컨테이너의 크기가 자신의 사이즈에 포함 된 참고 문헌의 크기가 아닌 오브젝트의 크기를 언급. []36의 크기를 가지며, 참조 4의 크기를 갖는 경우

그러므로 다음 [[]]의 크기는, 따라서, 40 36+4이다.

이제 [[[]]][x]입니다. 여기서 x[[]]을 나타냅니다. 따라서 [[[]]]의 크기는 []에 참조 크기를 더한 크기이므로 40도 마찬가지입니다.

4

크기는 가장 바깥 쪽 개체를 나타내며 중첩 된 개체는 참조하지 않습니다. 원근감이 getsizeof 인 경우 개체 크기는 개체의 크기와 개체가 아닌 개체에 포함 된 포인터의 크기를 더한 크기입니다. 다음에서 이것을 볼 수 있습니다

>>> import sys 
>>> sys.getsizeof([]) 
64 
>>> sys.getsizeof([[]]) 
72 
>>> sys.getsizeof([[[]]]) 
72 
>>> sys.getsizeof([[],[]]) 
80 
>>> sys.getsizeof([[[]],[[]]]) 
80 

당신이 반복적으로 객체의 크기를 찾거나 다른 메모리 프로파일 링을 사용해야합니다 중 총 메모리 사용량을 얻을합니다.

또한 자신의 개체를 작성하고 getsizeof 크기를 올바르게 반환하려면 직접 __sizeof__ 메서드를 구현할 수 있습니다.

import sys 
class mylist: 
    def __init__(self, iterable): 
     self.data = list(iterable) 

    def __sizeof__(self): 
     return object.__sizeof__(self) + \ 
      sum(sys.getsizeof(v) for v in self.__dict__.values()) + \ 
      sum(sys.getsizeof(item) for item in self.data) 

original_data = [[1,2,3], [1,2,3]] 
print(sys.getsizeof(original_data)) 
foo = mylist(original_data) 
print(sys.getsizeof(foo)) 

결과 :

~/code_snippets$ python3 sizeof_list.py 
80 
336