Serc
An experimental CPython bytecode compiler, written in Rust.
Highlights
- Compile Python source to CPython
.pycfiles without a CPython installation. - Target Python 3.12, 3.13, 3.14, and 3.15 with a single executable.
- Check source files and recursively compile packages from the command line.
- Embed the compiler via the Rust library.
In a single-worker benchmark, Serc compiled NumPy faster than CPython’s built-in bytecode compiler. Serc also produces byte-for-byte identical output on an extensive corpus of real-world Python code, including Django, Airflow, and Transformers.
| Project | Serc | CPython 3.14.5 compileall |
Speedup |
|---|---|---|---|
| NumPy 2.4.6 (505 files) | 1.194 s ± 0.023 s | 1.739 s ± 0.060 s | 1.46× |
However, Serc is also experimental, and so may emit incorrect bytecode in some cases!
Installation
Install from crates.io with Rust 1.96 or later:
cargo install serc-cli --locked
Getting started
Given hello.py:
def greet(name):
return f"Hello, {name}!"
Compile it to bytecode, emitted at __pycache__/hello.cpython-314.pyc:
serc compile hello.py
Pass a directory to compile its Python files recursively, or use --check to
compile without writing cache files:
serc compile path/to/package
serc compile --check path/to/package
Compilation uses the available CPUs by default. Use --jobs (or -j) to set a
limit, including --jobs 1 for serial compilation. You can also set the default
with RAYON_NUM_THREADS:
serc compile --jobs 4 path/to/package
Python version
Serc emits Python 3.14-compatible bytecode by default, but supports target
selection with --python-version. For example, to emit Python 3.15 bytecode:
serc compile --python-version 3.15 path/to/package
Serc supports the following CPython minor versions:
| Target | Pinned CPython release |
|---|---|
3.12 |
3.12.14 |
3.13 |
3.13.15 |
3.14 |
3.14.5 |
3.15 |
3.15.0rc2 |
Each target writes its own cache tag and bytecode magic number, so the four
versions can coexist under __pycache__.
Rust library
Add Serc to your Cargo.toml:
[dependencies]
serc = "0.1.0"
Compile Python source and serialize the resulting code object in CPython's marshal format:
let module = serc::compile("print('Hello, world!')\n", "hello.py").unwrap();
let marshaled = module.marshal();
Compilation defaults to Python 3.14. See the
library guide for selecting another Python
version and generating .pyc files.
License
Serc is licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Serc by you, as defined in the Apache-2.0 license, shall be dually licensed as above, without any additional terms or conditions.
Release files for serc 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| serc-0.1.0.tar.gz | 2.2 MB | Details |
Built distributions (wheels)
Total release size: 80.8 MB
Release files / serc-0.1.0.tar.gz
| Download URL | serc-0.1.0.tar.gz |
|---|---|
| Size | 2.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dbfd4a4930cdfd63916d31328bb1133a82ec5197c5b7b2859ee204f53a1f20c8
|
|
BLAKE2b-256 checksum How to use checksums |
329a7d5fe60794f3bfc13bed37d4d91fc652b68ddea6d3b2d2e276cc956de903
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-win_arm64.whl
| Download URL | serc-0.1.0-py3-none-win_arm64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | Python 3 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
b6826f7eb6a3f026bbb85a857656e0221eb116bf00a5c19f61f700fe4451d945
|
|
BLAKE2b-256 checksum How to use checksums |
524d1e8c4005670f7d06bce8fdc511602ca45bb70ec84184a39cadf0ca55daf3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-win_amd64.whl
| Download URL | serc-0.1.0-py3-none-win_amd64.whl |
|---|---|
| Size | 4.3 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
803f440e1048e267d453c64a473e97074fa0c7e751625a5dea204ced565f84d2
|
|
BLAKE2b-256 checksum How to use checksums |
77777eb112b3cbdd3ad049e4a57e76195ca8bcb5213ffde422d2a181859efb0b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-win32.whl
| Download URL | serc-0.1.0-py3-none-win32.whl |
|---|---|
| Size | 4.1 MB |
| Tags | Python 3 Windows x86-32 |
|
SHA-256 checksum How to use checksums |
5749479b6f48376870f7e2960303a117c07adde8d924234d4ad608935f18b5fb
|
|
BLAKE2b-256 checksum How to use checksums |
b441e92ccb538bfbfcfd23664ecf4fd7edfe0ff67b4528fa6aaaa4f4976ad0e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-musllinux_1_1_x86_64.whl
| Download URL | serc-0.1.0-py3-none-musllinux_1_1_x86_64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | Linux musl 1.1+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
89c7a0ae215d482a343e3dea0c8b5aa6fbc473d29146cf8c4b9bf9447db47cf8
|
|
BLAKE2b-256 checksum How to use checksums |
1c0106f179d8684a0c159a9c6436fcad4567f8adc4ede8232da899b72914ae67
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-musllinux_1_1_riscv64.whl
| Download URL | serc-0.1.0-py3-none-musllinux_1_1_riscv64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | Linux musl 1.1+ RISC-V 64 Python 3 |
|
SHA-256 checksum How to use checksums |
a8957a7301241658d772235a31ba5fbd64c28a621a0e64783622ac8a1b6a9ea8
|
|
BLAKE2b-256 checksum How to use checksums |
122d15730ade0bf009e48a93fcfbb4bb7a9c4716fbf92698e5545e16c934fe77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-musllinux_1_1_i686.whl
| Download URL | serc-0.1.0-py3-none-musllinux_1_1_i686.whl |
|---|---|
| Size | 4.5 MB |
| Tags | Linux musl 1.1+ x86-32 Python 3 |
|
SHA-256 checksum How to use checksums |
609b31e0ef9c046d65ce6cb617b3499efd0655bea16e4f843a95d2cc71e11910
|
|
BLAKE2b-256 checksum How to use checksums |
cb8cfba3473d6612d315978e33e26b5fca9e4dce323aa00b529276fe96dd47d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-musllinux_1_1_armv7l.whl
| Download URL | serc-0.1.0-py3-none-musllinux_1_1_armv7l.whl |
|---|---|
| Size | 4.3 MB |
| Tags | Linux musl 1.1+ ARMv7l Python 3 |
|
SHA-256 checksum How to use checksums |
172d0525f6d22c436b2f4f55c24a9fa454974df84213b47ba423c304afdbfa6a
|
|
BLAKE2b-256 checksum How to use checksums |
25c2b07cb637119a9c5a107eba708f905f2834494f7248129d76eb86a31a3b2e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-musllinux_1_1_aarch64.whl
| Download URL | serc-0.1.0-py3-none-musllinux_1_1_aarch64.whl |
|---|---|
| Size | 4.2 MB |
| Tags | Linux musl 1.1+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
a2a2d84b429fa32a9206d1ac4f13186bbbc4369bf6c2529de8c57e8ec7585b65
|
|
BLAKE2b-256 checksum How to use checksums |
90639944e17a3925f2e50fb125cda85c4545064bf0f15a9eb572f71003fee644
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-manylinux_2_31_riscv64.whl
| Download URL | serc-0.1.0-py3-none-manylinux_2_31_riscv64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | Linux glibc 2.31+ RISC-V 64 Python 3 |
|
SHA-256 checksum How to use checksums |
cc58b92f8605fe2de398fe6eb8c91ba91810a914085578751dcc280efe78e7ff
|
|
BLAKE2b-256 checksum How to use checksums |
b52614cb8a9dae8daf8399499e9510232a892ac33b7fc266f40d4982a9947225
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-manylinux_2_28_aarch64.whl
| Download URL | serc-0.1.0-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 4.1 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
c60ad12c70e54517ab436712ccfdb887bda4594719d8b555f4d32af2628d59b7
|
|
BLAKE2b-256 checksum How to use checksums |
19e985c8a0e70f9b8dbb8de80d21d4b7092f83442d3d207fab3caac8f17cc855
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | serc-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 4.4 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
3a16990f5e75137ed732861c4f5cc88ec35b81b01645e78a9cc5a1524d135942
|
|
BLAKE2b-256 checksum How to use checksums |
10576b5a9ccf79fcca163033a9a4239f4a4856fc48a13b8494ae038d7b6f5814
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
| Download URL | serc-0.1.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl |
|---|---|
| Size | 4.8 MB |
| Tags | Linux glibc 2.17+ IBM System/390x Python 3 |
|
SHA-256 checksum How to use checksums |
9ab4c7a284f2b3bd3b26f4ccaec03b08e54ca86358dfba85a78c6a26e436ca41
|
|
BLAKE2b-256 checksum How to use checksums |
3da2ee2efbb2b393c00b30006024b3b498c6f90fa8b8121e6f008b0fc7a0a4ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
| Download URL | serc-0.1.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl |
|---|---|
| Size | 4.7 MB |
| Tags | Linux glibc 2.17+ PowerPC 64-le Python 3 |
|
SHA-256 checksum How to use checksums |
972c7ad0c1973f94890f8a1f7d134fbb73fa6e859e9d778988f5f580390d3d03
|
|
BLAKE2b-256 checksum How to use checksums |
f7ef1171a8f40ca9b7960e46cd38c366137b55894128dfd003d2ee7420671b50
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
| Download URL | serc-0.1.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl |
|---|---|
| Size | 4.5 MB |
| Tags | Linux glibc 2.17+ x86-32 Python 3 |
|
SHA-256 checksum How to use checksums |
7d2891c86c9f61ad01bfb040371c03097912d4efb03fb6e7eee42e4f622241e3
|
|
BLAKE2b-256 checksum How to use checksums |
072b797614abb9fb9f6e94f3ce3e23443eb6d5a11450d77ab8b44d30d106ffde
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
| Download URL | serc-0.1.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl |
|---|---|
| Size | 4.2 MB |
| Tags | Linux glibc 2.17+ ARMv7l Python 3 |
|
SHA-256 checksum How to use checksums |
20f1eb4bcd8fdcb6f485a48403ca956a16e92fbab963ff5e4cbfe27f3489a60a
|
|
BLAKE2b-256 checksum How to use checksums |
ec6c951b76b39866fa88e987b1cfede0f09cc992b5e585a015eb232bd40783d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-macosx_11_0_arm64.whl
| Download URL | serc-0.1.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
f4b67fd9ea136df101173bd153d960c9e753473e515c434d29dd385171548de7
|
|
BLAKE2b-256 checksum How to use checksums |
69fc679845a3e0755a7b5932e30c2e72188a93b39a16557fce5fff0f32d27b81
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | serc-0.1.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 4.2 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
f07d755825be72b4b7d4c098ede1544186b8ec3fc0d82b6ea6b43e3ad24e8b6f
|
|
BLAKE2b-256 checksum How to use checksums |
5f7a3809bd5cdb35d6c602ce9202485ac5e3d4b537db1c1091cd06ec5c84c88e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / serc-0.1.0-py3-none-linux_armv6l.whl
| Download URL | serc-0.1.0-py3-none-linux_armv6l.whl |
|---|---|
| Size | 4.4 MB |
| Tags | Python 3 linux armv6l |
|
SHA-256 checksum How to use checksums |
85c372a6318e5e48b5ef9ecf7c1819e2a42a8d568e312e8788fe482d53eb0613
|
|
BLAKE2b-256 checksum How to use checksums |
7ad825e417e76ea21541fc51ce90d876d16c8f7ba541b8ed4d25049905e5290a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|