Nuitka:把Python编译成C++,再编译成一个可执行文件

Nuitka:把Python编译成C++,再编译成一个可执行文件Python 的特点是写得快 跑得慢 C 的特点是写得慢 跑得快 那有没有办法结合双方的优点 有的 兄弟 有的 Nuitka 简介 Nuitka 是一款开源的 Python 编译器 旨在将 Python 代码转换为高效的 C 代码并编译为本地机器码

大家好,欢迎来到IT知识分享网。

Python的特点是写得快、跑得慢,C++的特点是写得慢、跑得快。那有没有办法结合双方的优点?

有的,兄弟,有的——Nuitka。

简介

Nuitka是一款开源的Python编译器,旨在将Python代码转换为高效的C++代码并编译为本地机器码,从而显著提升运行速度。与传统的Python解释器不同,Nuitka通过静态编译技术绕过解释执行的性能瓶颈,同时保持与CPython的完全兼容性。它的核心目标包括优化执行效率、保护源代码安全、简化部署流程,并支持跨平台运行。自2011年发布以来,Nuitka已成为Python生态中重要的性能优化工具之一。

Nuitka:把Python编译成C++,再编译成一个可执行文件

Nuitka

Nuitka 由开发者 Kay Hayen 创建,最初是为了解决Python在计算密集型任务中的性能问题。随着Python 2到Python 3的过渡,Nuitka 逐步完善了对新版本语法的支持,并引入了插件系统以兼容主流第三方库(如NumPy、PyQt)。近年来,Nuitka 增加了商业版本,提供更高级的优化功能,例如LLVM后端支持和图形化界面工具(Nuitka-UI),进一步降低了使用门槛。

官网:Nuitka the Python Compiler  Nuitka the Python Compiler (https://nuitka.net/)

安装

pip install nuitka

除此之外,系统还需要安装整套的 C++ 编译工具链。以 Linux 为例:

sudo apt install build-essential patchelf

代码示例

写一个简单的 hello.py 文件:

import sys def main(): print('Hello world!') if __name__ == '__main__': main() sys.exit(0)

编译运行(大约需要3分钟):

$ nuitka --onefile hello.py Nuitka-Options: Used command line options: --onefile hello.py Nuitka: Starting Python compilation with Nuitka '2.6.9' on Python (flavor Python Build Standalone), '3.12' commercial grade 'not Nuitka: installed'. Nuitka: Completed Python level compilation and optimization. Nuitka: Generating source code for C backend compiler. Nuitka: Running data composer tool for optimal constant value handling. Nuitka: Running C compilation via Scons. Nuitka-Scons: Backend C compiler: gcc (gcc 12). Nuitka-Scons: Backend C linking with 7 files (no progress information available for this stage). Nuitka-Scons:WARNING: You are not using ccache, re-compilation of identical code will be slower than necessary. Use your OS package Nuitka-Scons:WARNING: manager to install it. Nuitka-Postprocessing: Creating single file from dist folder, this may take a while. Nuitka-Onefile: Running bootstrap binary compilation via Scons. Nuitka-Scons: Onefile C compiler: gcc (gcc 12). Nuitka-Scons: Onefile C linking. Nuitka-Scons:WARNING: You are not using ccache, re-compilation of identical code will be slower than necessary. Use your OS package Nuitka-Scons:WARNING: manager to install it. Nuitka-Onefile: Using compression for onefile payload. Nuitka-Onefile: Onefile payload compression ratio (25.42%) size  to . Nuitka-Onefile: Keeping onefile build directory 'hello.onefile-build'. Nuitka: Keeping dist folder 'hello.dist' for inspection, no need to use it. Nuitka: Keeping build directory 'hello.build'. Nuitka: Successfully created 'hello.bin'. $ ./hello.bin Hello world! 

在 Linux 上,是生成 hello.bin 文件,大概有 11 MB。如果是在 Windows 上,则是生成 hello.exe 文件。

技术实现

查看上面编译后,得到的新增内容:

$ tree . ├── hello.bin ├── hello.build │   ├── build_definitions.h │   ├── __bytecode.const │   ├── __constants.bin │   ├── __constants.c │   ├── __constants.const │   ├── __constants_data.c │   ├── __constants_data.o │   ├── __constants.h │   ├── __constants.o │   ├── __constants.txt │   ├── __helpers.c │   ├── __helpers.h │   ├── __helpers.o │   ├── @link_input.txt │   ├── __loader.c │   ├── __loader.o │   ├── module.__main__.c │   ├── module.__main__.const │   ├── module.__main__.o │   ├── scons-debug.py │   ├── scons-debug.sh │   ├── scons-report.txt │   └── static_src │   ├── CompiledFunctionType.c -> /home/yanqd0/.cache/uv/archive-v0/EvJHHDXDJ8ypClEDwhByK/lib/python3.12/site-packages/nuitka/bu ild/static_src/CompiledFunctionType.c │   ├── CompiledFunctionType.o │   ├── MainProgram.c -> /home/yanqd0/.cache/uv/archive-v0/EvJHHDXDJ8ypClEDwhByK/lib/python3.12/site-packages/nuitka/build/stati c_src/MainProgram.c │   └── MainProgram.o ├── hello.dist │   ├── hello.bin │   └── libpython3.12.so.1.0 ├── hello.onefile-build │   ├── onefile_definitions.h │   ├── scons-debug.py │   ├── scons-debug.sh │   ├── scons-report.txt │   └── static_src │   ├── OnefileBootstrap.c -> /home/yanqd0/.cache/uv/archive-v0/EvJHHDXDJ8ypClEDwhByK/lib/python3.12/site-packages/nuitka/build/static_src/OnefileBootstrap.c │   └── OnefileBootstrap.o └── hello.py 5 directories, 36 files

除了源文件 hello.py,以及最终产物 hello.bin 以外,其它都是过程文件。

Nuitka 的编译过程分为多个阶段:首先将Python代码解析为抽象语法树(AST),然后通过静态分析推断变量类型并优化控制流逻辑,最终生成等效的C++代码。生成的代码依赖libpython处理动态特性(如反射),再通过GCC或Clang编译为二进制文件。这一过程支持链接时优化(LTO)和多线程编译,显著提升了生成代码的执行效率。此外,Nuitka能自动打包依赖项,确保生成的可执行文件无需额外安装Python环境。

Nuitka的主要功能包括高性能二进制生成、单文件打包(–onefile)、跨平台编译(支持Windows、Linux、macOS及ARM架构)和代码混淆保护。实测显示,数学计算类任务的运行速度可提升20%-50%,而冷启动速度甚至可达原生Python的10倍。对于商业软件开发者,Nuitka能有效防止反编译,同时通过插件系统兼容Django、PySide等复杂框架。生成的独立可执行文件最小可压缩至7MB,适合嵌入式设备或轻量化部署。

商业开源

它有一个开源版本,还有一个商业化版本。

自 2011 年由 Kay Hayen 发起,采用 Apache 2.0 开源协议,支持 Python 2.6 至 3.13 版本,并兼容主流操作系统(Windows/Linux/macOS)。开源版本持续维护社区生态,提供基础编译能力和插件系统(如 PyQt、NumPy 支持),但缺乏高级代码保护和商业级技术支持。

商业化版本由原团队开发,针对企业需求扩展了专有功能。商业版引入 LLVM 后端优化、深度代码混淆(AES-256 加密)和反逆向工程保护,适用于金融算法、医疗数据等敏感场景。订阅制服务提供图形化工具 Nuitka-UI、跨平台签名支持(如 macOS 公证)和优先技术响应,年费模式覆盖中小型到大型企业客户。商业版还优化了编译流程,例如通过 –lto=yes 实现链接时优化,将大型项目编译时间缩短 30%-60%。

和 PyInstaller 比较

PyInstaller 是广泛使用的 Python 可执行文件打包工具,之前介绍过。(《PyInstaller:轻松打包Python应用,实现跨平台分发》)

以下从核心特性、性能、适用场景等多维度进行综合比较:

对比项

Nuitka

PyInstaller

设计目的

将 Python 代码编译为 C/C++,生成高效原生二进制文件,优化执行速度和安全性。

打包 Python 代码及依赖项为独立可执行文件,简化部署,无需编译。

打包机制

通过编译为 C/C++ 代码并调用系统编译器生成二进制文件,支持静态分析和优化。

直接打包 Python 字节码(pyc)及依赖项到单一文件或目录,不编译代码。

执行速度

编译后代码接近原生性能,启动速度更快(毫秒级优势),适合计算密集型任务。

依赖 Python 解释器执行,启动速度较慢,但单文件模式下解压耗时可能掩盖差异。

安全性

编译为 C/C++ 代码,反编译难度极高,安全性强。

打包为 pyc 文件,可被反编译工具还原源码,需结合加密工具(如 Cython)提升安全性。

跨平台性

支持 Windows/Linux/macOS,但需在目标平台本地编译生成对应可执行文件(无交叉编译)。

同上,但部分依赖(如 GLIBC 版本)可能导致跨系统兼容性问题(如旧 Linux 系统无法运行)。

资源管理

需手动通过 –include-data-files 包含非代码资源,路径处理接近原生应用。

自动打包资源文件,需通过 –add-data 或 .spec 文件配置,运行时动态解压到临时目录。

打包速度

编译过程耗时较长,尤其涉及大型第三方库时;可通过 –nofollow-imports 跳过库编译。

打包速度快,直接复制依赖文件,适合快速迭代。

可执行文件大小

单文件模式下体积更小(依赖 C 编译优化),支持 zstandard 压缩。

单文件模式体积较大(包含完整 Python 运行时),但可通过 UPX 压缩。

易用性

配置复杂,需安装 C 编译器(如 MinGW64)、处理动态导入警告,文档较少,社区支持有限。

简单易用,命令行参数直观,文档完善,社区活跃,适合新手快速上手。

兼容性

支持 Python 2.6-2.7 和 3.3+,但对动态特性(如 exec、反射)需手动适配。

支持 Python 3.6+,兼容性更广,但对复杂依赖(如 PyTorch)可能需要额外配置。

典型适用场景

高性能计算、代码保护需求高的企业应用、嵌入式系统。

小型项目快速打包、跨平台分发、调试便捷的 GUI 工具。

总结

Nuitka 广泛应用于金融分析、物联网边缘计算、商业软件交付等领域,尤其适合需要兼顾性能与代码安全性的场景。尽管大型项目的编译时间可能较长,但其持续的社区更新和商业化功能扩展(如对Python 3.13的支持)使其保持竞争力。

优点虽然突出,缺点其实也很明显——编译速度极其慢。这个时间,远大于 PyInstaller 这类工具。

未来,Nuitka 或将进一步优化编译速度,并增强对新兴硬件(如RISC-V)的支持,巩固其作为Python编译优化首选工具的地位。

后续还会介绍几个和 Nuitka、PyInstaller 类似的同类工具。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/189559.html

(0)
上一篇 2025-10-03 10:15
下一篇 2025-10-03 10:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信