2015-07-10 63 views
3

如果我們創建一個空字典,如:idict = {},那麼爲這本字典分配了多少空間?我知道這個列表,如果我們初始化一個像ilist = []這樣的列表,它將總是過度分配大小,第一個是4個空格,然後是8.
字典怎麼樣?python中爲空字典分配了多少空間?

+0

http://stackoverflow.com/questions/327311/how-are-pythons-built-in -dictionaries-implemented – kgwong

+0

如果我們想檢查ASCII字符的副本,用256分配列表大小便宜還是分配字典便宜? – umassjin

+0

要檢查重複項,一組似乎更合適,因爲檢查成員資格是一組典型的基本操作。 –

回答

2

好吧,字典不會在其中存儲實際的字符串,它的工作原理有點像C/C++指針,所以你只會在字典中爲每個元素獲得一個常量開銷。

測試針對

import sys 
x = {} 
sys.getsizeof(x) 

本身由許多輪葉的字典,每個包含:

  • 當前存儲的對象的哈希碼(即未從位置預測的 由於使用了衝突解決方案 策略)

  • a poi向關鍵對象提供指向值的指針

  • 對象總共在32位上至少有12個字節,在64位上有24個字節。

字典開始時用8個空水桶,通過加倍的條目的數量被調整大小達到其容量時(目前(2N + 1)/ 3)。

+1

*「字典從8個空桶開始,每當容量達到時將條目數翻倍。」*排序。事實上,當它們大約2/3滿時,它們會以計算量增長。在這裏你可以看到完整的解釋https://hg.python.org/cpython/file/tip/Objects/dictobject.c#l258 – Sam

0

要..如果你曾經使用C++ then..If你看到Python解釋器的源代碼是誠實的,它實際上就像在C++associative map,你會看到它使用你的堆內存部分將數據存儲在兩個鍵入&使用指針將一個數據指向其他完全像map的作品在C++。在我的系統中它是280 ..現在@Navneet說你可以使用sys.getsizeof來計算大小。但請記住,它是系統特定的&因此,您的系統可能不會給你280bytes。理解如果它是280字節,則意味着它使用幾個相關指針的微妙線程來存儲指向數據結構的點