2013-07-10 22 views
7

當我運行下面的代碼時,我得到了3和36作爲答案。python中的len()和sys.getsizeof()方法有什麼區別?

x ="abd" 
print len(x) 
print sys.getsizeof(x) 

任何人都可以解釋我最近有什麼區別嗎?

+6

你是否查找過文檔? – moooeeeep

+0

@moooeeeep:據推測,OP認爲Python字符串就像C字符串;每個字符一個字節,可能還有一個空字節。 –

+1

不知道爲什麼這是封閉的。 2年後,答案正是我所尋找的,IMO與任何需要了解字符串大小的人非常相關。 – Realistic

回答

34

它們不是一回事根本就是

len()查詢包含在容器中的物品數量。對於字符串,即字符數:

返回對象的長度(項目數)。參數可以是一個序列(字符串,元組或列表)或映射(字典)。

sys.getsizeof()另一方面返回存儲器大小的物體的

返回以字節爲單位的對象的大小。該對象可以是任何類型的對象。所有內置對象都會返回正確的結果,但這不一定適用於第三方擴展,因爲它是特定於實現的。

Python字符串對象不是簡單的字符序列,每個字符1字節。

具體地說,sys.getsizeof()功能包括垃圾收集開銷如有:

getsizeof()調用對象的方法__sizeof__並且如果所述目的是通過垃圾收集器管理增加了額外的垃圾收集器的開銷。

字符串對象不需要被跟蹤(它們不能創建循環引用),但字符串對象的確需要比每個字符的字節更多的內存。在Python 2,__sizeof__方法返回(在C代碼):

Py_ssize_t res; 
res = PyStringObject_SIZE + PyString_GET_SIZE(v) * Py_TYPE(v)->tp_itemsize; 
return PyInt_FromSsize_t(res); 

其中PyStringObject_SIZE是該類型的C結構報頭大小,PyString_GET_SIZE基本上是一樣的len()Py_TYPE(v)->tp_itemsize是每個字符尺寸。在Python 2.7中,對於字節字符串,每個字符的大小是1,但它是PyStringObject_SIZE,這會讓您感到困惑;在我的Mac機大小爲37個字節:

>>> sys.getsizeof('') 
37 

對於unicode字符串每個字符尺寸上升到2或4個(取決於編譯選項)。在Python 3.3及更高版本中,Unicode字符串佔用每個字符1到4個字節,具體取決於字符串的內容

相關問題