Python 3.12中为何'Öl'占用内存比'Ö'更少?
为什么Python 3.12中'Öl'的内存占用比'Ö'小?
你的观察精准命中了Python 3.12对字符串存储逻辑的新优化细节,核心原因在于不同场景下字符串内部编码的选择和对象开销的差异:
ASCII字符串的紧凑存储:对于仅含ASCII字符(码点0-127)的字符串,Python 3.12采用1字节/字符的Latin-1编码,且短字符串的字符直接内联在对象内部,所以长度每增加1,总内存大小仅增加1字节——这就是
''(41)、'H'(42)、'Hi'(43)的规律来源。单个Latin-1非ASCII字符的特殊处理:像
'Ö'这种单个属于Latin-1范围(码点128-255)的非ASCII字符,Python 3.12会采用UCS-2编码存储。UCS-2每个字符占2字节,再加上单字符字符串的额外对象开销(比如哈希缓存、编码标识字段的额外存储),最终总大小达到61字节。多字符Latin-1字符串的优化切换:当字符串是
'Öl'这类包含多个字符(其中既有Latin-1非ASCII字符,又有ASCII字符)时,Python会检测到所有字符都属于Latin-1范围,因此切换回1字节/字符的Latin-1编码。此时虽然字符串长度是2,但整体对象的总开销(编码标识、内联存储的结构开销)比单个UCS-2编码的字符串更小,所以总大小为59字节,反而比单个'Ö'的61字节少。
这种差异是Python 3.12针对字符串存储做的针对性优化带来的副作用——单字符非ASCII Latin-1字符串的存储逻辑和多字符场景不同,导致了看似反常的内存大小结果。
内容的提问来源于stack exchange,提问作者Aemyl
相关产品推荐
相关产品推荐

