PyPy与Nuitka对比

15

最近几天,我在玩弄一个叫做Nuitka的工具,它可以将Python编译成可执行的C/C++程序。

我还没有发现任何与PyPy相比较的Nuitka的速度优势。那么,Nuitka的意义是什么?难道我错过了什么吗?

2个回答

29

Nuitka和PyPy有非常不同的目标。

Nuitka对您的Python项目进行Ahead Of Time(AOT)编译,使用Python C-API将其编译成C语言。因此,它更类似于Cython。尽管这是一个年轻的项目,但令人印象深刻的是已经实现了与庞大的Python语言规范的完全兼容性。下一步将是启用编译器进程中的优化,就像gcc -O3一样。请注意,Nuitka用于将您的Python代码转换为可执行文件。然后,您可以通过对原始Python代码进行某种程度的混淆来“发布”可执行文件。

PyPy对正在运行的代码进行Just In Time(JIT)编译,将其编译为汇编语言。它跟踪运行的代码,识别热点,并生成程序的热部分的更快版本。它也具有与Python语言规范的完全兼容性。它不会提前转换您的Python代码,因此您将Python代码作为最终产品“发布”。

我期望这两个项目都将继续改进执行速度,但它们针对非常不同的需求。


6

Nuitka: Nuitka是用Python编写的,它将Python模块作为输入,并提供C程序作为输出。该输出与libpython和其他静态C文件一起执行,可作为扩展模块或可执行文件。

需要知道的是,与原始Python程序相比,Nuitka编译输出高度优化且更快,但仍无法与从纯C代码创建的可执行文件相匹配。许多开发人员声称,与基本Python代码解释相比,使用Nuitka编译程序可以获得4倍的速度。
最好的部分是,除了3.3、3.9、2.6、2.7等版本之外,Nuitka几乎兼容所有版本的Python。
截至目前,开发人员也在积极开发中,旨在将Nuitka转变为能够从Python代码中提供本机C性能的编译器。

PyPy: 与Nuitka类似,PyPy也支持Python 2和Python 3规范。 PyPy是CPython的最流行替代品,默认Python编译器。

最初创建PyPy编译器是为了加速Python执行,为此,它利用了即时编译(JIT)。 JIT编译器将原始代码作为输入并在执行之前将代码转换为机器代码。
使用PyPy不仅可以获得执行速度优势,还可以减少内存使用量,并提供编写无堆栈应用的选项,就像堆栈式Python一样。
值得注意的是,PyPy在短期运行过程中并不能为您提供性能或内存利用率优势。但是,在长时间运行的进程中,性能增益显着可见。
短暂运行进程性能不佳主要是因为JIT编译器需要时间来热身,因此带来固有的初始化开销。
对于内存使用情况也是如此,在小型程序中,JIT所需的额外内存超过了从已编译代码执行中获得的任何好处。开发人员已尝试使用PyPy在与原始Python代码执行相比最多可获得15倍的性能提升。
更多详细信息可以在此处找到:Nuitka vs PyPy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接