Nuitka:把 Python 代码编译成原生程序

Python 写起来爽,但分发和性能一直是痛点。Nuitka 这个项目就干一件事:把 Python 代码编译成 C 然后生成可执行文件,跑起来比原版快,发出去也不用对方装 Python。目前项目在 GitHub 上已有 14,903 颗星。

这个项目已经活跃开发超过十年,是 Python 社区中为数不多的全功能编译器方案。与简单的打包工具不同,Nuitka 做的是真正的编译:把 Python 代码转化成 C 代码,再编译成机器码。这意味着用户最终拿到的是一个原生程序,而不是一个自解压的 Python 解释器加脚本包。

正文顶部截图

它能做什么

Nuitka 是 Python 的编译器,底层用 Python 写成。它把 Python 模块翻译成 C 级别的程序,然后调用 libpython 执行。对开发者来说,不需要改代码,也不需要学新语法。任何能正常运行的 Python 脚本,都能丢给 Nuitka 编译。

兼容性覆盖了 Python 2.6 到 3.14 的全部版本,标准库和第三方扩展模块都能正常处理。这一点比 Cython 这类方案省心很多,后者需要手动标注类型才能获得理想效果。

编译模式有三种。普通模式只编译入口脚本,运行仍需 Python 环境。standalone 模式把依赖全部打包到一个目录。onefile 模式更进一步,生成单个可执行文件,用户拿到就能双击。对于要分发给非技术用户的场景,onefile 最实用。

性能方面,根据 pystone 测试,编译后的程序比 CPython 快 2 到 3 倍。开启 LTO 链接时优化后可达 3.3 倍,再加 PGO 性能引导优化能达到 3.7 倍。实际项目中,计算密集型的代码提速明显,IO 密集型的提升相对有限。Nuitka 的优化思路以兼容性为前提,只去掉运行时中不必要的开销,不做可能破坏兼容的激进优化。

另外,Nuitka 支持增量编译,修改代码后只需重新编译改动的部分,不需要每次都全量构建。

为什么选它

市面上能把 Python 转成可执行文件的工具不止一个,但 Nuitka 有几个独特的地方。

一是语法覆盖度。Nuitka 支持 Python 的所有语法构造,包括闭包、生成器、元类这些动态特性,不需要开发者做取舍。兼容模式甚至可以模拟 CPython 的已知行为差异。

二是打包质量。onefile 模式生成的单文件启动速度快,体积控制得不错,不像某些方案打包出来的文件动辄几百兆。对分发场景来说,用户体验影响很大。

三是长期维护。项目已经开发超过十年,社区活跃,对 Python 新版本的跟进比较及时。从 3.12 到 3.14 都在发布后很快得到支持。

快速上手

安装和编译都很直接:

python -m pip install Nuitka
python -m nuitka --mode=onefile hello.py

Windows 下会自动检测 C 编译器,依次尝试 MSVC、MinGW64、zig。检测不到就自动下载 MinGW64,基本不需要手动配置。macOS 和 Linux 下也是类似,系统有 gcc 或 clang 就能直接用。

README区域截图

需要注意的地方

编译时间比较长,大型项目可能需要几分钟。调试信息不如原版 Python 直观,排查问题会麻烦一些。AGPL 协议对商用分发有限制,用之前需要确认。如果项目中用到了复杂的 C 扩展模块,有时需要额外配置才能编译通过。

如果你的场景是写个工具分发给同事或客户,或者想在 Python 基础上白嫖一些性能,Nuitka 值得一试。用它编译日常脚本可能有点大材小用,但当你需要交付一个让用户双击就能跑的 Python 程序时,它应该是最省心的选择之一。

大材小用,但当你需要交付一个让用户双击就能跑的 Python 程序时,它应该是最省心的选择之一。

更多推荐