Pyston:给 Python 插上 JIT 翅膀,性能提升 30%
文章目录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 方案不同后者往往需要预热阶段才能达到最佳性能。除了 JITPyston 还引入了 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 版本开始。