大家好,我是正在实战各种 AI 项目的程序员晚枫。
为什么字符串比较用 == 和 is 结果可能不同?字符串驻留(intern)机制是怎么回事?这一讲彻底搞懂。
📖 开篇:字符串不是 C 的 char 数组
在 C 语言中,字符串就是字符数组。但在 Python 中,字符串是复杂的对象:
1 | s = "hello" |
不可变性是 Python 字符串的核心特性——这让字符串可以安全地用作字典键和集合元素。
🔤 PyASCIIObject / PyUnicodeObject
1 | // Include/unicodeobject.h |
Python 3.3+ 做了重大优化,区分了紧凑 ASCII 和 Unicode:
1 | import sys |
紧凑格式:数据直接存储在结构体后面,避免额外的指针间接访问。
🎯 Intern 机制
什么是 intern?
Intern 是「字符串驻留」——相同内容的字符串共享同一个内存对象:
1 | # 自动 intern 的字符串(编译时确定) |
为什么需要 intern?
- 节省内存:相同字符串只存一份
- 加速比较:
is直接比较指针,比逐字符比较快 - 字典键优化:相同的键字符串共享对象
手动 intern
1 | import sys |
典型应用场景
1 | # 场景:解析大量相同关键字的文本 |
🔍 字符串的内存布局
1 | import sys |
📝 字符串拼接的性能
1 | import time |
原因:+ 每次都创建新字符串对象并复制内容,时间复杂度 O(n²)。join 预分配总空间,一次复制。
⚠️ 字符串与 bytes 的区别
1 | # str:Unicode 字符序列 |
💡 本节作业
- 用
sys.intern()优化一个大量字符串比较的程序 - 比较
s1 + s2 + s3和"".join([s1, s2, s3])的性能 - 用
id()验证:哪些字符串会共享对象?
🎯 本讲总结
PyUnicodeObject:支持 Unicode 的字符串对象,有紧凑和紧凑+两种格式。
Intern 机制:相同内容的字符串共享对象,省内存+加速比较。
手动 intern:sys.intern() 用于优化大量相同字符串的场景。
拼接性能:join() 比 + 快很多,预分配是关键。
📚 推荐教材
《Python 编程从入门到实践(第 3 版)》 | 《流畅的 Python(第 2 版)》 | 《CPython 设计与实现》
🔗 课程导航
← 上一讲:数字类型实现 | 下一讲:容器类型实现 →
💬 联系我
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| B 站 | Python 自动化办公社区 |
主营业务:AI 编程培训、企业内训、技术咨询