在Python 3中,字符串的大小如'test'.__sizeof__()
返回73
。但是,如果我將它編碼爲utf-8,則'test'.encode().__sizeof__()
返回37
。python3 - 爲什麼字符串的大小比編碼大
爲什麼字符串的大小遠遠大於它在utf-8中編碼的大小?
在Python 3中,字符串的大小如'test'.__sizeof__()
返回73
。但是,如果我將它編碼爲utf-8,則'test'.encode().__sizeof__()
返回37
。python3 - 爲什麼字符串的大小比編碼大
爲什麼字符串的大小遠遠大於它在utf-8中編碼的大小?
在CPython中,最大爲3.2,在3.x中成爲str字符的unicode字符被存儲爲16位或32位無符號整數,具體取決於是否有「窄」或「寬」構建。 (總是縮小在Windows上,都在Linux上使用)。在3.3及之後的版本中,CPython切換爲靈活的字符串表示(FSR),每個字符使用1,2或4個字節(8,16或32位),具體取決於字符串中'最寬'字符所需的寬度。見PEP 393
對於64位3.4.3,'test'.__sizeof__ == 53
,而仍然b'test'.__sizeof__ == 37
。由於兩個字符都使用1個字節,額外的16個字節是字符串對象中的額外開銷。其中一部分就是隱藏的規範,說明字符串是否使用每個字符1,2或4字節。作爲比較,'tes\u1111'.__sizeof__() == 82
和'tes\U00011111'.__sizeof__() == 92
。
(不,我不知道爲什麼跳到82.一個可能必須檢查代碼是肯定的。)
str
python 3通常存儲爲16位整數而不是字節,與編碼的bytes
對象不同。這使得字符串大一倍。一些額外的元數據可能也存在,進一步膨脹對象。
你知道我在哪裏可以找到有關此文檔嗎? – uday 2015-04-06 04:08:38
@uday'bytes'非常簡單,是一個字節序列。你可以在https://docs.python.org/3.4/c-api/unicode.html找到一些關於'str'的有趣信息 – quantum 2015-04-06 04:45:17