返回资讯中心
外部精选
软件工程
#开发者实时流

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 撰写。

Hacker News 最新agustaf2026/11/10 · 今天8 分钟阅读

以下正文由 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 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →