
Serc:用 Rust 编写的 CPython 字节码编译器
来源标题:Serc: A CPython bytecode compiler written in Rust (Codex built, 2-4x speedup)
Serc 是一个用 Rust 编写的实验性 CPython 字节码编译器,在 Django、Airflow、Transformers 等真实代码库上能生成与 CPython 逐字节一致的输出,覆盖 CPython 3.12 至 3.15 及优化级别 0、1、2,编译速度比 CPython 的 compileall 快 3-4 倍。不过它仍属实验性,某些情况下可能生成不正确的字节码。其代码变更、PR 摘要和文档均由 Codex 中的 GPT 撰写。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
一个用 Rust 编写的实验性 CPython 字节码编译器。
Serc 在大量真实 Python 代码语料(包括 Django、Airflow 和 Transformers)上生成的输出与 CPython 逐字节完全一致,覆盖 CPython 3.12、3.13、3.14 和 3.15,以及优化级别 0、1 和 2,同时编译速度比 CPython 的 compileall 快 3-4 倍。但 Serc 仍是实验性的!因此在某些情况下可能会生成不正确的字节码。
Serc 是实验性的。本 README 由人工编辑,但所有代码变更、PR 摘要和附加文档均由 Codex 中的 GPT 编写。
使用 Rust 1.96 或更高版本从 crates.io 安装:
cargo install serc-cli --locked
快速开始
给定 hello.py:
def greet(name): return f"Hello, {name}!"
编译为字节码,输出到 pycache/hello.cpython-314.pyc:
serc compile hello.py
传入目录可递归编译其中的 Python 文件,或使用 --check 仅编译而不写入缓存文件:
serc compile path/to/package serc compile --check path/to/package
编译默认使用所有可用 CPU。可在命令行使用 --jobs(或 -j)或通过 RAYON_NUM_THREADS 环境变量设置上限,包括用 --jobs 1 进行串行编译。
serc compile --jobs 4 path/to/package
默认情况下,Serc 会跳过 .pyc 已是最新的文件:先检查字节码格式和失效模式,再比较源文件的时间戳和大小(针对基于时间戳的缓存)或内容哈希(针对基于哈希的缓存)。传入 --force(或 -f)可重新编译每个文件,例如在切换编译器或原生构建配置之后。(即使使用 --force,Serc 也不会覆盖符号链接或特殊文件。)
Serc 默认生成兼容 Python 3.14 的字节码,但支持通过 --python-version 选择目标版本。例如,要生成 Python 3.15 字节码:
serc compile --python-version 3.15 path/to/package
Serc 支持以下 CPython 次版本:
每个目标版本写入各自的缓存标签和字节码魔数,因此四个版本可以在 pycache 下共存。
使用 -O 移除断言并将 debug 设为 false,与 Python 的 -O 模式一致。使用 -OO 还会额外移除模块、类和函数的文档字符串:
serc compile -O hello.py serc compile -OO hello.py
也可以通过 --optimize 0、--optimize 1 或 --optimize 2 显式选择级别。默认级别为 0。优化后的缓存遵循 Python 的命名约定,例如 pycache/hello.cpython-314.opt-1.pyc 和 pycache/hello.cpython-314.opt-2.pyc,因此三个级别可以共存。
[dependencies] serc = "0.1.0"
编译 Python 源代码并以 CPython 的 marshal 格式序列化生成的代码对象:
let module = serc::compile("print('Hello, world!')\n", "hello.py").unwrap(); let marshaled = module.marshal();
许可证
Serc 采用以下任一许可证授权:
除非你明确声明 otherwise,否则你故意提交以纳入 Serc 的任何贡献(按 Apache-2.0 许可证的定义)均应按上述方式双重授权,不附加任何额外条款或条件。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。