640?wx_fmt=gif

哪个版本的 Python 最快?

Python 3 真的比 Python 2 慢吗?

Python 3 最快的版本是哪个?

......

640?wx_fmt=jpeg

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

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

以下对作者原文的翻译:


640?wx_fmt=png

使用 Python 性能测试套件


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

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

  2. 其中不包含 PyPy

640?

你可以通过执行 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)。


640?wx_fmt=png

测试结果


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

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

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

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

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

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


640?wx_fmt=png

渲染 HTML 模板


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

640?

如图所示,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 兼容。


640?wx_fmt=png

启动时间测试


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

640?

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

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


640?wx_fmt=png

加密测试(Crypto):crypto_paes


640?

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

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


640?wx_fmt=png

算法测试:n-queens


640?

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


640?wx_fmt=png

浮点运算测试


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

640?

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


640?wx_fmt=png

正则表达式测试


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

640?

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

补充:后来发现是 PyPy 性能出了问题,PyPy 开发团队后来看到了这项测试结果,花了几个小时把性能问题修复了

640?


640?wx_fmt=png

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 版本中着重要解决的问题。


640?wx_fmt=png

PyPy 很快,我要使用它吗?


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

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

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


640?wx_fmt=png

结论


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

本文经授权转自开源中国,作者 OSC-达尔文。


征稿啦

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。


————— 推荐阅读 —————


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=gif

640?wx_fmt=gif

Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐