简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试。

Python 其实是一种相当快的语言,但它并不像编译型语言那么快。 这是因为官方实现的 CPython 解释执行的,更准确地说,是 Python 代码被编译为字节码,然后进行解释。这对学习是很有好处的,因为可以在 Python REPL 中运行代码并立即查看结果,而不必编译和执行。 但是由于 Python 程序并没有那么快,开发人员多年来创建了几个 Python 的编译器,包括 IronPython 和 Jython。

快速的性能并不是编译的唯一原因,可能诸如 Python 之类的脚本语言最大的缺点是你需要隐式地向客户提供源代码。

我想比较同一平台上的一些 Python 编译器,特别是那些支持 Python 3.x 的编译器。最后,我选择了四个,都在 Ubuntu Linux上运行,他们是 Nuitka,PyPy,Cython 和 cx_Freeze。

比较 Python 编译器

有人已经完成了创建 Python 基准测试的工作。我选择了 PyStone,这是 Python 的创建者Guido van Rossum 对 C 程序的翻译(而 C 程序本身是 Ada 程序的翻译)。 我在 GitHub 上找到了开发人员 Christopher Arndt 的转换版本,它能够兼容 Python 3。 下面是 Pystone 的CPython(即标准 Python)性能:

Python 2.7.15Rc1 2 : 272,647 pystones/second.
Python 3.6.5       : 175,817

正如你所看到的,Python 2 和 Python 3 之间有很大的区别(每秒 Pystones 越多越好)。在下面的细分中,所有的 Python 编译器都针对 Python 3 进行基准测试。

Nuitka

尽管可以按照下载页面上的说明操作,但 Ubuntu 上的只需:

$ sudo apt install Nuitka

Nuitka 还需要一个 C 编译器,所以我下载了 clang。可以使用以下方法安装它:

$ sudo apt install clang

Nuitka 默认使用 gcc,但是一个参数允许你使用 clang,所以我用两者测试了它。 clang 编译器是 llvm 系列的一部分,旨在作为 gcc 的现代替代品。使用 gcc 编译 pystone.py 就像这个(第一行)一样简单,或者使用 clang(第二行),并使用链接时间优化 gcc(第三行):

$ nuitka pystone.py
$ nuitka pystone.py --clang
$ nuitka pystone.py --lto

编译(大约 10 秒钟)完成后,我从终端运行了 pystone:

$ ./pystone.exe 500000

结果是

Size  Execution pystones/sec
1. 223.176 Kb  597,000
2. 195,424 Kb  610,000
3. 194.2   kb  600,000

这些是 5 次运行的平均值,我尽可能多地关闭了进程。

PyPy

Guido van Rossum 曾经说过:「如果你希望你的代码运行得更快,你应该只使用PyPy。」我将编译好的二进制文件下载到一个文件夹中,并将 pystone.py 复制到其下的 bin 文件夹中。然后我像这样运行:

$ ./pypy3.5 pystone.py

结果是惊人的 1,776,001 pystones/sec,几乎是 Nuitka 的三倍。

PyPy 使用即时编译器并做了一些非常巧妙的东西来实现它的速度。根据基准测试的报告,它平均比 CPython 快 7.6 倍。 我很容易相信。 唯一(轻微)的缺点是它总是落后于 Python 版本。

生成一个 EXE 需要一些工作,你必须将你的 Python 编写成一个名为 RPython 的子集。

Cython

Cython 不仅仅是 Python 的编译器,它是 Python 的超集,支持与 C / C++ 的互操作性。 CPython是用 C 编写的,所以它是一种通常可以很好地与 Python 混编的语言。

使用 Cython 进行设置有点繁琐,它不像 Nuitka 那样开箱即用。首先,必须从扩展名为 .pyx的 Python 文件开始,你运行 Cython 来创建一个 pystone.c 文件:

$ cython pystone.pyx --embed

不要忽略 –embed 参数,接下来,你用这条命令编译 pystone.c:

$ gcc $(python3-config --includes) pystone.c -lpython3.6m -o pystone.exe

如果遇到任何错误,例如「找不到 -lpython 版本」,则可能是因为你的 Python 版本。要查看安装的版本,请运行以下命令:

$ pkg-config --cflags python3

毕竟,Cython 只给出 228,527 pystones/sec,但是,Cython 需要你做一些指定变量类型的工作。Python 是一种动态语言,因此没有指定类型, Cython 使用静态编译,使用 C 类型变量可以产生更好的优化代码。 (文档相当广泛,需要阅读。)

Size  Execution pystones/sec
1. 219,552 Kb  228,527
cx_freeze

这是一套用于将 Python 脚本「冻结」为可执行文件的脚本和模块,可以在GitHub上找到。我安装了它并创建了一个冻结文件夹来管理内容:

$ sudo pip3 install cx_Freeze --upgrade

我在安装脚本中发现的一个问题是缺少“lz”的错误。你需要安装 zlib 运行它来安装它:

$ sudo apt install zlib1g-dev

之后,cx_Freeze 命令使用 pystone.py 脚本创建了一个 dist 文件夹,其中包含一个 lib 文件夹,一个 5MB 的 lib 文件和 pystone 应用程序文件:

$ cxfreeze pystone.py --target-dir dist
Size  Execution pystones/sec
1. 10,216   174,822

不是最快的性能,因为它与 CPython 的速度相同。 (Python 冻结包括将应用程序与所需的Python 元素一起放在单个文件(或文件夹)中,而不是编译,这意味着目标不需要Python。)

结论

我对 PyPy 的表现感到敬畏,编译非常快,在按下回车键后不到一秒就产生了结果。 如果你想要一个 exe,我推荐 Nuitka,这是一个不费吹灰之力的编译,运行速度比 CPython 快。你也可以自己试用这些 Python 编译器,看看哪种方法最适合特定需求。

4 个快速的 Python 编译器相关推荐

  1. gcc 编译python_4 个快速的 Python 编译器 for 2018

    简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试. Python 其实是一种相当快的语言,但它并不像编译型语言那 ...

  2. python编译软件排行榜_4 个快速的 Python 编译器 for 2018

    简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试. Python 其实是一种相当快的语言,但它并不像编译型语言那 ...

  3. python实现即时编译器_4 个快速的 Python 编译器 for 2018

    简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试. Python 其实是一种相当快的语言,但它并不像编译型语言那 ...

  4. inno setup打包的安装包如何在卸载完程序后可以继续安装_这两个方法就够了!快速制作Python程序Windows安装包...

    点击关注州的先生 编程应用.实战教程,不容错过 /00/ 前言 我们使用Python可以编写很多提高工作和学习效率的小工具,在编写完之后,如果我们想将其分享给更多的人使用,那么最便捷的方法就是将其打包 ...

  5. 【python零基础入门学习】Python入门,带你快速学习Python 基础语法

    ython 语言与 Perl,C 和 Java 等语言有许多相似之处.但是,也存在一些差异. 在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程. 第一个 Python ...

  6. python编辑器安卓手机版_python编译器安卓下载-python编译器手机版下载v1.8.0 安卓版-2265安卓网...

    python编译器手机版是一款超棒的编程工具.专业的编程内容设计,多种多样的语言选择,完美的脚本,强大的功能,没有任何广告,快速的编写,还有快速提示,自由复制等等! python编译器安卓软件介绍 - ...

  7. python编写游戏加速器_Numba:用CUDA加速的高性能Python编译器

    [IT168 编译]Python是一种高效的动态编程语言,广泛应用于科学.工程和数据分析应用领域.使python如此受欢迎的因素有很多,包括其干净的.表达性的语法和标准的数据结构,综合的"内 ...

  8. matlab调用python编译器_Matlab转python编译器-Matlab/Octave转Python编译器(smop) 0.2.5 免费版 - 河东下载站...

    Matlab转python编译器是一款功能相当强大的转换编译器:它主要就是为了帮助用户将Matlab.Octave快速的转换成为您需要的Python,非常的适合这科学的计算过程中,matlab代码进行 ...

  9. 【pipenv】 快速入门,超全面的pipenv教程!(教你如何快速创建python虚拟环境!)

    文章目录 一.pipenv的快速入门 0.快速上手 1.安装 2.卸载 3.跟新包 4.首次运行 5.删除虚拟环境 6.与虚拟环境相关的常用命令 (0)展示环境中已安装的包 (1)包的安装 (2)包的 ...

最新文章

  1. Swift中NSRange和Range的转换
  2. Grafana中整个Dashboard报错问题解决
  3. delphi7升级delphi2007可以互用马_奶爸带娃玩“升级版摇摇马”火了,像极了传说中的“甘为孺子牛”...
  4. 总结 | 计算机视觉领域最常见几中损失函数
  5. Web前端技巧分享:教你用GD库生成验证码
  6. 这个宝藏工具,会给你一种黑客般的感觉
  7. ls命令查看文件和目录列表
  8. postman压力测试_如何用Postman简单做接口自动化
  9. 【数据分析师---数据可视化】第二章:plotly绘图进阶篇(地图可视化,动态数据可视化)
  10. html怎样让页面居中显示,HTML怎么让页面居中
  11. 传智播客黑马程序员Java学习笔记(一)
  12. RFC2544优化步长测试——信而泰网络测试仪实操
  13. python3 使用writerows写入csv时有多余空行的处理办法
  14. 如何突破思维局限去思考世界,去读读以下三个理论
  15. 【坑】html5中使用context.lineWidth设置线的宽度是1,然而输出的宽度是2的原因
  16. 3D~RPG游戏的制作
  17. 看共享单车上的智能车锁有何区别
  18. Springboot Swagger2 Unable to infer base url问题解决
  19. C语言-求一元二次方程的解-你是否会了呢?
  20. 什么是VHDL?一文带你了解VHDL语言

热门文章

  1. 誉天就业招聘:云计算/数通运维工程师
  2. 深度学习基础23(数据偏移what,how,why)
  3. Linux vim与vi 的使用详细
  4. DaVinci Resolve Studio 18 for mac(达芬奇剪辑软件)
  5. SaaS应用选型,必须考虑的10个安全问题
  6. Java 利用http协议与Domino实现sso单点登录
  7. Python爬虫笔记——HTML基础认识
  8. 【头歌】 标准ACL配置
  9. Pr_cc 学习笔记(四)历史纪录-工作区-调板-撤销-蓝布棉门帘
  10. 使用U盘安装统信UOS20服务器操作系统1050a出现“设置基础软件仓库时出错”报错导致无法继续安装的解决方法