2015-04-06 57 views
1

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

为什么字符串的大小远远大于它在utf-8中编码的大小?

回答

0

在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.一个可能必须检查代码是肯定的。)

0

str python 3通常存储为16位整数而不是字节,与编码的bytes对象不同。这使得字符串大一倍。一些额外的元数据可能也存在,进一步膨胀对象。

+0

你知道我在哪里可以找到有关此文档吗? – uday 2015-04-06 04:08:38

+0

@uday'bytes'非常简单,是一个字节序列。你可以在https://docs.python.org/3.4/c-api/unicode.html找到一些关于'str'的​​有趣信息 – quantum 2015-04-06 04:45:17

相关问题