【问题标题】:PyPy vs. NuitkaPyPy 与 Nuitka
【发布时间】:2017-12-27 12:29:51
【问题描述】:

在最后几天,我在玩 Nuitka,这是一个将 Python 编译成可执行 C/C++ 程序的工具。

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

【问题讨论】:

    标签: pypy nuitka


    【解决方案1】:

    Nuitka 和 PyPy 的目标截然不同。

    Nuitka 使用 python C-API 将您的 python 项目提前 (AOT) 编译为 C。这种方式更类似于 Cython。它仍然是一个年轻的项目,但令人印象深刻的是,它已经完全兼容庞大的 python 语言规范。下一步将是在编译器过程中启用优化,就像gcc -O3。请注意,Nuitka 用于将您的 python 代码转换为可执行文件。然后,您“运送”可执行文件,并对原始 python 代码进行某种程度的模糊处理。

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

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

    【讨论】:

      【解决方案2】:

      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找到

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 2022-08-20
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多