在过去的几天里,我一直在玩 Nuitka,这是一个将 Python 编译成可执行 C/C++ 程序的工具。
我没有发现 Nuitka 的任何速度优势(与 PyPy 相比)。那么,Nuitka 的含义是什么?我错过了什么吗?
Nuitka 和 PyPy 有非常不同的目标。
Nuitka使用 python C-API 将您的 python 项目提前 (AOT) 编译为 C。这种方式更类似于 Cython。它仍然是一个年轻的项目,但令人印象深刻的是,它已经实现了与庞大的 python 语言规范的完全兼容。下一步将是在编译器过程中启用优化,就像gcc -O3
. 请注意,Nuitka 用于将您的 python 代码转换为可执行文件。然后,您“运送”可执行文件,并对原始 python 代码进行某种程度的混淆。
PyPy将运行代码即时 (JIT) 编译为程序集。它跟踪您正在运行的代码,识别热点,并为您的程序的热点部分生成更快的版本。它也与 python 语言规范完全兼容。它不会提前转换您的 Python 代码,因此您将 Python 代码“运送”为最终产品。
我预计这两个项目将继续提高执行速度,但它们针对的需求截然不同。
Nuitka:Nuitka 是用 Python 本身编写的,它以 Python 模块作为输入,并提供 c 程序作为输出。输出针对 libpython 和其他静态 c 文件执行,并作为扩展模块或可执行文件工作。
重要的是要知道,Nuitka 编译的输出经过高度优化并且比原始 python 程序更快,但它仍然无法与从纯 C 代码创建的可执行文件的性能相匹配。与基本的 Python 代码解释相比,许多开发人员声称使用 Nuitka 编译程序的速度提高了 4 倍。
Nuitka 最好的部分是它兼容几乎所有 Python 版本,包括 3.3、3.9、2.6、2.7 等。
到目前为止,它的开发也非常活跃,开发人员的目标是将 Nuitka 转换为可以从 Python 代码中提供本机 C 性能的编译器。
PyPy:与 Nuitka 一样,PyPy 也支持 Python 2 和 Python 3 规范。PyPy 是默认 Python 编译器 CPython 最流行的替代品。
PyPy 编译器最初是为了加速 Python 执行而创建的,为此,它利用了即时编译 (JIT)。基于 JIT 的编译器将原始代码作为输入,并在执行之前将代码转换为机器代码。
执行速度并不是 PyPy 获得的唯一优势,它还可以减少内存使用,并提供了一个选项来编写无堆栈应用程序,就像无堆栈 python 一样。
同样重要的是要注意,PyPy 不会在短期运行的进程上为您提供性能或内存利用优势。但是,当您有长时间运行的进程时,性能提升非常明显。
运行时间短的进程缺乏性能主要是因为 JIT 编译器需要时间来预热,因此会带来固有的初始化开销。
内存使用也是如此,对于小型程序,JIT 所需的额外内存超过了从执行编译代码中获得的任何好处。与原始 python 代码执行相比,开发人员已经尝试使用 PyPy 获得高达 15 倍的性能。
更多细节可以在这里找到Nuitka vs PyPy