最近 urllib3 v2.6.0 版本发布以及随后的快速修复,凸显了一个令人沮丧的问题:Python 的 `DeprecationWarning` 系统似乎无法有效提示库更新。尽管早在 2022 年就已弃用存在问题的 API,并已发出警告超过三年——甚至在一个广泛使用的软件包中——删除仍然破坏了 Kubernetes、Fastly 和 Airflow 等依赖库。 作者认为,仅依赖 `DeprecationWarning` 并不足够,因为它很容易被忽略。讨论的潜在解决方案包括创建自定义警告类以避免被过滤掉,或者干脆放弃提前通知,转而采用频繁的主要版本发布(如 Cryptography 库)。 核心问题在于,当前警告机制无法触达足够的开发者以主动解决 API 变更,使维护者陷入两难境地:破坏性变更与支持过时代码之间。
## 优化一个简单的编程语言解析器
本文详细介绍了对一个简单编程语言(“simp”)的递归下降解析器的优化过程。最初的实现使用了直接的抽象语法树(AST),节点被装箱,并使用向量,虽然灵活但内存密集。基准测试重点关注吞吐量(每秒解析的代码行数)和最大内存使用量,文件大小从kB到100MB不等。
初步结果显示性能尚可,但促使我们探索减少内存使用的技术。**字符串驻留**——用共享字符串缓冲区中的索引替换拥有的字符串——通过减少分配并实现O(1)字符串比较,显著提高了性能。通过**指针压缩**(“扁平AST”),利用内存池和32位索引代替64位指针,进一步获得了收益。
最终的优化,一个**“超扁平”AST**,将节点数据(标签、长度、子节点索引,甚至内联值)打包到最小空间中,尽可能消除子节点的单独指针。这涉及一个自定义声明式宏系统来管理节点定义和访问。
超扁平AST展示了最显著的改进,与最初的树表示形式相比,内存使用量减少了3倍以上,并提高了所有文件大小的解析速度。作者得出结论,经过相当大的努力,生成的AST对于这种用例来说几乎是最佳的。完整的代码,包括基准测试,可在GitHub上找到。