详细的多维度测评,看看哪个 Python 版本速度最快!

局长
 局长
发布于 2018年07月19日
收藏 11

哪个版本的 Python 最快?

当然,这些问题由多种因素决定,其中的主要的因素是什么呢?我们又如何为自己的应用寻找最快的 Python 版本呢?带着这些问题,Hackermoon 上一位叫 Anthony Shaw 的作者为我们做了一些测试。

Anthony Shaw :Dimension Data 的 Talent 集团总监,Python 软件基金会成员,Apache 基金会成员

以下是对作者原文的翻译:

使用 Python 性能测试套件

正如之前我在 speed.python.org 网站提到的,Python 核心开发团队非常重视性能问题,这对于比较官方基准和 CPython 版本非常有用。

  1. 如图,测试结果很难直观读取

  2. 其中不包含 PyPy

你可以通过执行 pip install performance 命令来下载测试套件,然后执行如下命令:

pyperformance run --python={chosen_python_runtime} -o my_results.json

该命令会针对 Python 的目标版本多次运行一系列“实际”应用程序,并记录测试结果,取其平均值。

本文我对以下官方版本进行了测试:

  • Python 2.7.10

  • Python 3.4.4

  • Python 3.5.4

  • Python 3.6.1

  • Python 3.7 beta 2(译者注:作者进行测试时 Python 3.7 版本还未正式发布,beta 2 性能与正式版非常接近,同样具有参考价值。Python 3.7 正式发布内容请看这里

同时还测试了 PyPy(5.6)和 PyPy 3(5.10.0)。

测试结果

我根据这套测试用例进行了测试,你也可以根据自己的情况自己编写一套测试。

我编写了一个简单的脚本,来获得性能数据文,并将它们绘制成了图表。脚本代码你可以在这里找到:

  • https://gist.github.com/tonybaloney/4e8e45f9128e9eb6e4f36c73ba5e5574

所有图表都以秒为单位,数值越低,表示性能越好。

完整的测试结果及图表展示可请参阅:

  • https://github.com/tonybaloney/performance_testing/tree/master/png

渲染 HTML 模板

django_html 测试将使用 Django 模板渲染引擎来构建一个 150x150 的 HTML 表格。 它利用了 Django 引擎的 Content 和 Template 类。

如图所示,Python 3.7 比 Python 2.7 快 1.19 倍,但除此之外,其他 Python 3 版本都没有 Python 2.7 快。该结果与 speed.python.org 网站的测试结果一致。

PyPy 的测试结果显示,PyPy 比 CPython 的任何 Python 版本都快,PyPy 3 比 PyPy 慢两倍。Django 2.0 及更高版本已决定放弃对 Python 2 的支持,因此 PyPy 将不再与 Django 2 兼容。

启动时间测试

该部分测试解释器的启动时间

如图所示,Python 2.7 是所有测试版本中启动速度最快的。

注:此处暂不讨论 PyPy 的测试结果,文末再谈。

加密测试(Crypto):crypto_paes

在这个测试中,Python 2 的速度明显快于 Python 3,因为 Crypto 要求大量数字运算,而 Python 3 没有 32 位整数类型,只有一个长整型(long integer)。

同样差距比较明显的是,PyPy 3 比 PyPy 慢 5 倍

算法测试:n-queens

结果显示,在 CPython 系列中,Python 3.7 性能最佳。此外,PyPy 3 和 PyPy 测试结果比较接近,PyPy 小胜。

浮点运算测试

“浮点”基准测试需要人工创建繁重的浮点运算应用程序,在这里我们通过 math.cos(),math.sin() 和 math.sqrt() 函数创建,总共创建 10 万个浮点对象。

PyPy 非常适合浮点运算,在大量的数字运算、可预测的类型和方法以及循环上展现了非常优秀的性能。Python 3.7 具有新的方法能快速调用操作码,该操作码正在此测试中刚好用上,表现佳。

正则表达式测试

在这项测试中,我选用了 50 个最受欢迎的网页,并记录了所有正则表达式的操作。 每个操作都被赋予权重,该权重是根据页面流行度的估计以及在加载每个页面时执行的次数来计算的。 最后,数据中的字母使用 ROT13 进行编码,其方式不会影响正则表达式与输入的匹配程度。

PyPy 的测试结果让人大跌眼镜,不知道它都经历了些什么......

补充:PyPy 后来看到了这项测试结果,花了几个小时把问题修复了

Python 3 比 Python 2 快吗?

综上测试所述,答案是 Yes!虽然也有几项测试结果显示 Python 3 比 Python 2 慢:

  • 加密测试:Python 3 的比 Python2 慢 1.35 倍(原因在上文已做解释)

  • 启动时间测试:Python 3 比 Python 2 慢 1.39 倍

但从整体结果来看,Python 3 更快。CPython 核心开发团队曾表示,启动速度问题是他们在 3.8 和 3.9 版本中着重要解决的问题。

PyPy 很快,我要使用它吗?

PyPy 有 JIT 即时编译器,在执行可预测的重复性任务时非常高效,而 Python 性能测试需要多次运行同一段代码来保证准确性,因此,PyPy 面对这种测试性能,表现比 CPython 更佳。

但是,PyPy 的 JIT 编译器的显著缺点就是启动成本高,并且,许多 C 语言扩展程序缺乏兼容性。另外,由于 PyPy 是用 Python 编写的,许多模板在 PyPy 中无法工作,使用者需要时常进行检查。

PyPy 也同样需要面对从 Python2 向 Python3 转变的问题。PyPy3 还不太稳定,PyTest 就已经放弃了对 PyPy3 的支持。

结论

Python 在所有官方版本测试中表现最佳,PyPy 在解释器测试的表现最佳。Python 2 以后会用得越来越少,直到废弃。如果 PyPy 3 的速度始终不能比 PyPy 快,能有所提升也是好的。

编译自:Hackermoon

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:详细的多维度测评,看看哪个 Python 版本速度最快!
加载中

精彩评论

钛元素
钛元素
一直在入门,从未会使用
s
smallwhite110
python比性能有啥意义。。
没有头像也是一种帅
没有头像也是一种帅
一帮矬子里面比谁长得高,有意思吗???
clouddyy
clouddyy
入门就学的python3
dwingo
dwingo
追求性能的就不会用python了

最新评论(14

陶永强
陶永强
我觉得c之类的native 好用又快
捍卫机密
捍卫机密
就脚本语言而言,我觉得py速度还行。只是一升级就大多数功能挂完,这个我实在无法接受。
沧海一刀
沧海一刀
pyjy用过么
没有头像也是一种帅
没有头像也是一种帅
一帮矬子里面比谁长得高,有意思吗???
谁偷了我的名字
谁偷了我的名字
测啥测 java最快 此贴终结 不接受争辩。谢谢
s
smallwhite110
python比性能有啥意义。。
漫步海边小路
漫步海边小路

引用来自“漫步海边小路”的评论

提个语文和数学问题,"PyPy 3 比 PyPy 慢两倍"这句话怎么理解?一倍是指本身的数量,慢一倍就是0了,慢两倍是多少?,这句话能说"PyPy 比 PyPy3 快一倍"吗?在用倍的时候才容易看出来小便的语文水平高低

引用来自“Richie”的评论

慢一倍是0???慢一倍应该是0.5才对吧
1的1倍是1,1的2倍是2,1的3倍是3,每一倍都是和本身相等的数量,看来你的语文也不行,我见过很多人的语文都是这样.你可以看看小便说的慢两倍的图,和你说的慢一倍实际都说是pypy3的速度比pypy的多出一倍,但是你们两个用了截然不同的两个数字
R
Richie

引用来自“漫步海边小路”的评论

提个语文和数学问题,"PyPy 3 比 PyPy 慢两倍"这句话怎么理解?一倍是指本身的数量,慢一倍就是0了,慢两倍是多少?,这句话能说"PyPy 比 PyPy3 快一倍"吗?在用倍的时候才容易看出来小便的语文水平高低
慢一倍是0???慢一倍应该是0.5才对吧
漫步海边小路
漫步海边小路
提个语文和数学问题,"PyPy 3 比 PyPy 慢两倍"这句话怎么理解?一倍是指本身的数量,慢一倍就是0了,慢两倍是多少?,这句话能说"PyPy 比 PyPy3 快一倍"吗?在用倍的时候才容易看出来小便的语文水平高低
Mr小Z
Mr小Z
认为性能很重要,python不仅仅是一个用来处理自动化任务的脚本语言
返回顶部
顶部