PyPy 对比努伊特卡

PyPy vs. Nuitka

在过去的几天里,我一直在玩弄 Nuitka,这是一种将 Python 编译成可执行 C/C++ 程序的工具。

我没有发现 Nuitka 有任何速度优势(与 PyPy 相比)。那么Nuitka是什么意思呢?我错过了什么吗?

Nuitka 和 PyPy 的目标截然不同。

Nuitka 使用 python C-API 将您的 python 项目提前 (AOT) 编译为 C。这样它更类似于Cython。它仍然是一个年轻的项目,但令人印象深刻的是已经实现了与庞大的 python 语言规范的完全兼容。下一步将是在编译过程中启用优化,就像 gcc -O3 一样。请注意,Nuitka 用于将您的 python 代码转换为可执行文件。然后你 "ship" 可执行文件,对原始 python 代码进行一定程度的混淆。

PyPy 将 运行 代码实时 (JIT) 编译为程序集。它跟踪您的 运行 代码,识别热点,并生成程序热点部分的更快版本。它也完全兼容 python 语言规范。它不会提前转换您的 python 代码,因此您 "ship" 您的 python 代码作为最终产品。

我预计这两个项目将继续提高执行速度,但它们针对的需求截然不同。

努伊特卡: 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 是 CPython 最流行的替代品,CPython 是默认的 Python 编译器。

PyPy 编译器最初是为了加速 Python 执行而创建的,为此,它利用了即时编译 (JIT)。基于 JIT 的编译器将原始代码作为输入,并在执行前将代码转换为机器代码。

执行速度并不是使用 PyPy 的唯一优势,它还减少了内存使用,并提供了一个选项来编写无堆栈应用程序,就像无堆栈 python 一样。

同样重要的是要注意,PyPy 不会在短 运行 进程上为您提供性能或内存利用优势。但是,当您拥有长 运行 进程时,性能提升会非常明显。

短 运行 进程缺乏性能主要是因为 JIT 编译器需要时间预热,因此带来了固有的初始化开销。

内存使用也是如此,对于小程序,JIT 所需的额外内存超过了执行编译代码所获得的任何好处。与原始 python 代码执行相比,开发人员已经尝试使用 PyPy 获得高达 15 倍的性能。

可在此处找到更多详细信息Nuitka vs PyPy