简评: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 编译器,看看哪种方法最适合特定需求。

python编译软件排行榜_4 个快速的 Python 编译器 for 2018相关推荐

  1. python都有什么包_常用的Python包有哪些,如何快速掌握Python编程

    Python入门简单.功能强大,是很多想要入行IT开发行业人士的主要选择.Python包可以帮助Web开发人员快速和容易地创建应用程序和功能,因此很多企业在招聘时都会考察求职者对于Python包的掌握 ...

  2. 可视化Python编译软件:GUI2Exe

    一般在Python下的编译软件用的是py2exe,可能对初学者来说,命令行的方式不如图形界面来的直观,幸运的是老外写了一个集成了多个py编译软件的图形界面,操作相当方便. 这里我简单写了下使用过的方法 ...

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

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

  4. python编程软件排行榜_Python编程开发工具:这10个对Web开发者最有用的Python包

    Python编程一时间成为了开发人员最喜欢的语言之一.无论是专业的,业余的,还是作为一个Python初学者,都可以从Python编程语言及其程序包中受益.Python已经被证明是当今最具活力的面向对象 ...

  5. python编译软件和编译环境选择(Windows下,新手看)

    想要使用python进行编程,一般有以下的开发环境 1,python官网下载的python包中自带的IDLE 2,pycharm 3,  下载anaconda自带的spider 第1种的开发环境非常简 ...

  6. 学习分享 | 通过C++,python的对比,帮你快速入门python

    一.前言 对于只接触过静态语言,而从未使用过动态语言的人来说,第一次看到python的语法可能会大为惊叹.不用申明变量类型?不用等老半天编译完成就能直接运行?不用小心的维护指针?还不用写CMakeli ...

  7. 十大python开发软件-必看 | 2020年,Python十大应用领域介绍!

    原标题:必看 | 2020年,Python十大应用领域介绍! python作为一门当下极其火爆的编程语言,得到世界范围内无数编程爱好者和开发者喜欢并不是偶然的,除了要比其他编程语言更容易入门,pyth ...

  8. python入门要多久-初学者如何快速上手python入门要多久

    今天跟大家讨论一下对于一个新手如何快速入门python. python是一种非常接近人类语言的解释性高级语言,如果你学过java,应该知道解释性语言区别于编译性语言.python作为一种高级语言,功能 ...

  9. 0基础学python做什么工作好-如何快速学习Python编程?可以做什么职业?

    近些年Python热度不减,一直占据编程语言排行榜的前几位.人生苦短,让我们来学一学Pyhotn吧,找到一份满意的工作还是没有问题的. Python语言本身所具有的优势,决定了从事Python学习的开 ...

最新文章

  1. python 之路200行Python代码写了个打飞机游戏
  2. 图像分割 c语言程序,OpenCV实现图像切割功能
  3. 基于ECLIPSE的C++环境配置。。
  4. nacos oaut服务地址_spring-boot+nacos+spring-oauth2整合方案
  5. Debian7 apt源设置
  6. c语言不会可以学好java吗_不会C语言能学Java吗
  7. 分支和循环结构的应用(习题)
  8. LeetCode--20. 有效的括号(栈,删除法)
  9. 今天看到了和我男朋友不一样的程序员!好帅哦!
  10. Matlab Tricks(六)—— 矩阵乘法的实现
  11. Win8下用DOSBox编写汇编语言
  12. bind 绑定标签的用法
  13. adb工具下载及安装
  14. 协整理论与面板数据分析
  15. LEBERT:Lexicon Enhanced Chinese Sequence Labelling Using BERT Adapter
  16. 深度学习:卷积神经网络从入门到精通
  17. 一篇小文入门 Python
  18. java sendkeys方法_java+selenium——键盘操作+复制粘贴(keys类)
  19. Problem A. Alarm Clock
  20. android没有adm_求助 Android studio的ADM打不开是什么原因

热门文章

  1. [ZJOI2013]防守战线
  2. FTP服务器搭建及操作(一)
  3. jquery常用的插件1000收集
  4. Android之gdbserver/gdb调试
  5. Fuchsia中GN与Ninja构建demo
  6. Mac彻底卸载搜狗输入法
  7. C++ string与vectorfloat类型相互转换之stringstream
  8. OpenGL ES简介(一)
  9. android getLong()用法
  10. iOS平台一套完善的Crash Report解决方案