简评: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 Fast Python Compilers for 2018

4 个快速的 Python 编译器 for 2018的更多相关文章

  1. java程序员快速掌握python系列——概述

    这一系列主要是总结学习python过程中的方方面面(已经学完,时间大概是一周左右).当然限于个人水平java也就是够用,python短时间内也不可能深入到哪里去.所以这次的分享的目的是能够快速使用py ...

  2. 快速查询Python脚本语法

    /********************************************************************* * 快速查询Python脚本语法 * 说明: * Char ...

  3. 程序员带你十天快速入门Python,玩转电脑软件开发(四)

    本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...

  4. 程序员带你十天快速入门Python,玩转电脑软件开发(三)

    声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群5 ...

  5. 程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  6. 程序员带你十天快速入门Python,玩转电脑软件开发(一)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  7. 新手如何快速入门Python

    学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人最终能精通语言,成为执牛耳者,他们是金字塔的最顶层.虽然万事开头难,但好的开始是成功的一半,今天这篇文章就来谈谈如 ...

  8. 快速开始Python/WSGI应用程序

    快速开始Python-wsig应用程序 官方参考文档 安装 uwsgi 安装 pip install uwsgi uwsgi --version # 查看 uwsgi 版本 测试 uwsgi 是否正常 ...

  9. python从入门到精通之30天快速学python视频教程

    点击了解更多Python课程>>> python从入门到精通之30天快速学python视频教程 课程目录: python入门教程-1-Python编程语言历史及特性.mkv pyth ...

随机推荐

  1. git远程代码库回滚(webstorm下)

    git远程代码库回滚(webstorm下) 1. 场景 添加了一个文件[file-for-test.js]到git的控制下 进行了三次修改,并分别进行了三次commit,最后进行了一次push git ...

  2. 利用Fiddler对Android模拟器网络请求进行抓包

    安装使用Fiddler 下载安装Fiddler的方法这里就略过了,一路Next就行了.装好之后运行软件,正常情况这个时候我们已经可以对电脑的网络请求进行抓包了.Fiddler默认的代理地址是127.0 ...

  3. 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组

    [抄题]: Given an array nums and a target value k, find the maximum length of a subarray that sums to k ...

  4. 从HiveQL到MapReduce job过程简析

    一.简述 HiveQL是一种声明式语言,用户提交查询,而Hive会将其转换成MapReduce job,如下图.一般来说大部分时间可以无视这个执行过程的内部逻辑,但是如果能了解这些底层实现细节,在调优 ...

  5. freemaker优缺点

    1.什么是FreeMarker?FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的 ...

  6. 启动redis注意事项

    1.需要修改配置文件 redis.conf 三处 a.将bind 127.0.0.0    修改为  bind 0.0.0.0 b.daemonize no      修改为   daemonize ...

  7. [SoapUI] 如何让某个步骤的Assertion失败之后继续执行后面的步骤

    To continue tests executing after failed test step you need disable "Abort on error" optio ...

  8. 如何将.pem转换为.crt和.key

    如何将.pem转换为.crt和.key? 摘自: https://vimsky.com/article/3608.html 貔貅 技术问答 2017-10-08 23:11 certifica ...

  9. CentOS 7 升级内核 Kernel

    安装kernel 首先安装elrepo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.e ...

  10. Win 7 Windows Update无法自动更新解决方案

    最近发现系统很长时间没有自动更新过了,手动更新后,提示返回错误码WindowsUpdate_8024402F.网络上搜索到的解决方法大多是删除更新临时目录,重启WINDOWS UPDATE服务,然而试 ...