文章目录
- Pyston:给 Python 插上 JIT 翅膀,性能提升 30%
- 核心技术
- 兼容性
- 项目历程
Pyston:给 Python 插上 JIT 翅膀,性能提升 30%
Dropbox 在 2014 年启动了一个内部项目 Pyston,目标是给 Python 加上 JIT 编译能力,降低服务器成本。项目经历关停、重启、被 Anaconda 收购,到现在依然活跃在开源社区,收获了 2500 个 Star。
Pyston 提供两个版本:full 和 lite。前者是一个完整的 CPython 替代方案,后者是一个可 pip 安装的扩展模块。
Pyston-full 基于 CPython 3.8.12,集成了 JIT 编译器和其他优化手段。在 Web 服务基准测试中,它比标准 CPython 快约 30%。要尝试的话,从 GitHub Releases 页面下载安装包即可。官方也提供了 Docker 镜像,一条命令就能体验:docker run -it pyston/pyston。还有一个精简版镜像pyston/slim可供选择,减少了预装库的体积。
Pyston-lite 是纯 JIT 扩展,支持 Python 3.7 到 3.10。安装方式极其简单:pip install pyston_lite_autoload。这条命令会安装 JIT 引擎和一个自动加载器,Python 启动时自动激活 JIT。性能提升约 10%,但胜在兼容性好,现有二进制包无需任何修改。
核心技术
Pyston 用 DynASM 实现了低开销的 JIT 引擎。DynASM 是一个轻量级的动态汇编器,能在运行时生成机器码,同时保持较低的启动开销。这与传统 JIT 方案不同,后者往往需要预热阶段才能达到最佳性能。
除了 JIT,Pyston 还引入了 Quickening 技术。简单来说,它在程序运行时观察哪些字节码被频繁执行,然后把这些字节码替换为更高效的专用版本。配合属性缓存策略,同一个对象的属性访问结果被缓存下来,后续访问直接命中缓存,减少了每次查找的开销。
Full 版本额外包含 LTO(链接时优化)和 PGO(性能导向优化)。这些优化能进一步提升最终程序的运行时性能,但代价是首次构建需要较长时间,因为 LLVM 需要编译两次。
兼容性
Full 版本的问题是 API 兼容但 ABI 不兼容。这意味着用 pip 安装的 C 扩展需要重新编译才能运行,因为 Pyston 修改了 CPython 内部的 ABI 接口。目前社区还没有为 Pyston 提供预编译的 wheel 包,所以安装过程会触发编译步骤。如果遇到编译失败,通常和直接在 CPython 上编译该包遇到的问题一致。
Lite 版本不存在这些麻烦。它作为扩展模块加载到标准 CPython 中,与现有二进制包完全兼容。日常使用中推荐先尝试 Lite 版本,如果对性能有更高要求再考虑迁移到 Full 版本。
项目历程
Pyston v1 是 Dropbox 从零实现的 Python 2.7,采用 LLVM 作为后端编译方案,包含追踪垃圾回收器。2017 年 Dropbox 决定将主力开发语言迁移到其他选择,Pyston 项目随之关停。当时 Pyston v1 已经能够运行 Dropbox 的代码库,但存在内存占用偏高和兼容性问题。
2019 年,原开发团队在没有企业赞助的情况下重启项目,这次选择了不同的路线。他们不再从零实现,而是直接 fork CPython 3.8,在其基础上集成 JIT 和其他优化,称为 Pyston v2。2021 年团队加入 Anaconda,获得资金支持和打包工程能力。2022 年,团队根据用户反馈发布了 pyston-lite,降低了使用门槛。
Pyston 解决的问题很直接:让已有的 Python 代码跑得更快,不需要修改代码。对运行 Python 服务的团队来说,30% 的性能提升意味着可观的成本节省。如果项目对性能有要求又不打算换语言,可以尝试 Pyston,尤其是从 Lite 版本开始。
又不打算换语言,可以尝试 Pyston,尤其是从 Lite 版本开始。