2011-07-05 29 views
13

當我在字典的sys模塊中使用getsizeof方法時,我有些困惑。下面我創建了一個簡單的兩個字符串字典。這兩個字符串的大小明顯大於字典的大小。字典大小可能只是字典開銷,即它不考慮實際數據。找出整個字典的內存使用情況(鍵,值,字典開銷)的最佳方法是什麼?在Python中的內存使用字典?

>>> first = 'abc'*1000 
>>> second = 'def'*1000 
>>> my_dictionary = {'first': first, 'second': second} 
>>> getsizeof(first) 
3021 
>>> getsizeof(second) 
3021 
>>> getsizeof(my_dictionary) 
140 

回答

8

PythonDocs

recursive sizeof recipe參見用於使用getsizeof()遞歸地找到容器及其所有內容的尺寸的一個例子。

所以它只計算開銷,但是您可以使用this link中的函數來爲容器(如字典)計算它。

3

好,字典不存儲在其內部實際的字符串,它的工作原理有點像C/C++的指針,所以你只能在字典每個元素得到一個恆定的開銷。

總大小是

size = getsizeof(d) 
size += sum(map(getsizeof, d.itervalues())) + sum(map(getsizeof, d.iterkeys())) 
+4

要迂迴,如果任何值是一個容器(而不是標量),它也需要向下鑽取該容器。 –

3

遞歸getsizeof將獲得實際大小,但是如果您有多個詞典層並且只想得到粗略估計值。 json來得方便。

>>> first = 'abc'*1000 
>>> second = 'def'*1000 
>>> my_dictionary = {'first': first, 'second': second} 
>>> getsizeof(first) 
3049 
>>> getsizeof(second) 
3049 
>>> getsizeof(my_dictionary) 
288 
>>> getsizeof(json.dumps(my_dictionary)) 
6076 
>>> size = getsizeof(my_dictionary) 
>>> size += sum(map(getsizeof, my_dictionary.values())) + sum(map(getsizeof, my_dictionary.keys())) 
>>> size 
6495 
+0

絕對要點創意,但它需要一切可序列化,它更慢,並且如你所說這是一個近似... – Mark