python3 - 为什么字符串的大小比编码大

时间:2015-04-06 03:43:56

标签: python-3.x

在Python 3中,'test'.__sizeof__()等字符串的大小返回73。但是,如果我将其编码为utf-8,则'test'.encode().__sizeof__()会返回37

为什么字符串的大小明显大于utf-8中编码的大小?

2 个答案:

答案 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.可能必须检查代码才能确定。)