×

Python3 vs. Python2 大作战,谁将是性能之王?

96
开源中国 Db3aaf4f effd 43dc 9137 d6bf7f70211e
2018.07.19 11:01 字数 1662

文章来自开源中国(微信ID:oschina2013)

责编:OSC-达尔文

如需转载请注明上述来源,其他来源无效并视为侵权

哪个版本的 Python 最快?

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

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

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

使用 Python 性能测试套件

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

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

其中不包含 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 快,能有所提升也是好的。

更多精彩内容欢迎关注开源中国微信公众号 oschina2013

日记本
Web note ad 1