在Python 3中,'test'.__sizeof__()
等字符串的大小返回73
。但是,如果我将其编码为utf-8,则'test'.encode().__sizeof__()
会返回37
。
为什么字符串的大小明显大于utf-8中编码的大小?
答案 0 :(得分:0)
str
对象不同,python 3中的 bytes
通常存储为16位整数而不是字节。这使得字符串大两倍。可能还存在一些额外的元数据,进一步使对象膨胀。
答案 1 :(得分:0)
在CPython中,最多包括3.2,unicode字符(在3.x中成为str字符)被存储为16或32位无符号整数,具体取决于是否有一个“缩小”字符。或者'宽'建立。 (在Windows上总是缩小,都在linux上使用)。在3.3及以下版本中,CPython切换为灵活字符串表示(FSR),每个字符使用1,2或4个字节(8,16或32位),具体取决于“最宽”所需的宽度。 ;字符串中的char。见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.可能必须检查代码才能确定。)