鍍金池/ 問答/Python/ python字符串getsizeof()怎么計(jì)算的?

python字符串getsizeof()怎么計(jì)算的?

import sys
m=u"ab"
k=b"ab"
l="ab"
print(m,type(m),sys.getsizeof(m),"|",k,type(k),sys.getsizeof(k),"|",l,type(l),sys.getsizeof(l))

ab <class 'str'> 51 | b'ab' <class 'bytes'> 35 | ab <class 'str'> 51
怎樣計(jì)算出51,和35的數(shù)字的?
謝謝

import sys
a=456
b=0
print(sys.getsizeof(a),sys.getsizeof(b))

28 24
我記得int是一種類型,為什么一種類型的變量占內(nèi)存的大小還不一樣?。?/p>

回答
編輯回答
焚音

int對象還有很多方法和屬性,而且在python中數(shù)字對象可以無限大下去,所以內(nèi)存分配是在一個基礎(chǔ)之上動態(tài)分配的。

同理你看下面的代碼,一個道理,隨著內(nèi)容變多,內(nèi)存占用自然變大,但是有一個個基礎(chǔ)內(nèi)存占用:

import sys
m=u"ab"
k=b"ab"
l="ab"

print(sys.getsizeof(u""))
print(sys.getsizeof(u"a"))
print(sys.getsizeof(b""))
print(sys.getsizeof(b"a"))

2017年1月16日 01:17
編輯回答
痞性

我以python3版本為例說明, int 類型在python中是動態(tài)長度的。因?yàn)閜ython3中int類型是長整型,理論支持無限大的數(shù)字,但它的結(jié)構(gòu)其實(shí)也很簡單, 在 longintepr.h 中定義:

struct _longobject {
    PyObject_VAR_HEAD
    digit ob_digit[1];
};

這結(jié)構(gòu)是什么意思呢,重點(diǎn)在于 ob_digit 它是一個數(shù)組指針。digit 可認(rèn)為是 int 的別名。python的整型存儲機(jī)制是這樣的。比方要表示一個很大的數(shù): 123456789 。而每個元素最大只能表示3位十進(jìn)制數(shù)(為理解打的比方)。那么python就會這樣存儲:

ob_digit[0] = 789
ob_digit[1] = 456
ob_digit[2] = 123

低位存于低索引下。python中整型結(jié)構(gòu)中的數(shù)組,每個元素最大存儲 15 位的二進(jìn)制數(shù)(不同位數(shù)操作系統(tǒng)有差異32位系統(tǒng)存15位,64位系統(tǒng)是30位)。

因此,sys.getsizeof(0) 數(shù)組元素為0。此時(shí)占用24字節(jié)(PyObject_VAR_HEAD 的大小)。 sys.getsizeof(456) 需使用一個元素,因此多了4個字節(jié)。有興趣可以看看整型對象的分析: https://www.hongweipeng.com/i...

2018年7月16日 14:11