【发布时间】:2017-12-27 12:29:51
【问题描述】:
在最后几天,我在玩 Nuitka,这是一个将 Python 编译成可执行 C/C++ 程序的工具。
我没有发现 Nuitka 的任何速度优势(与 PyPy 相比)。那么,Nuitka 的含义是什么?我错过了什么吗?
【问题讨论】:
在最后几天,我在玩 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 是 CPython 最流行的替代品,它是默认的 Python 编译器。
PyPy 编译器最初是为了加速 Python 执行而创建的,为此,它利用了即时编译 (JIT)。基于 JIT 的编译器将原始代码作为输入,并在执行之前将代码转换为机器代码。
执行速度并不是 PyPy 获得的唯一优势,它还可以减少内存使用量,并提供了一个选项来编写无堆栈应用程序,就像无堆栈 Python 所做的那样。
还需要注意的是,PyPy 不会在短期运行的进程上为您提供性能或内存利用优势。但是,当您有长时间运行的进程时,性能提升会非常显着。
运行时间短的进程缺乏性能主要是因为 JIT 编译器需要时间来预热,因此会带来固有的初始化开销。
内存使用也是如此,对于小型程序,JIT 所需的额外内存超过了执行编译代码所获得的任何好处。与原始 python 代码执行相比,开发人员已经对 PyPy 进行了实验,以获得高达 15 倍的性能。
更多详情可以在这里Nuitka vs PyPy找到
【讨论】: