Python 3.11性能提升实测

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Python一直以其易用性风靡于开发者之间,然而其性能却时常为人所诟病。当前,Python 3.11发布在即,官方表示该版本带来了极大的性能提升。在这篇文章中,我们使用多种方法测试了不同Python版本的性能表现,从而为项目中Python版本的升级提供一些参考意见。

背景

随着计算机技术的蓬勃发展,如今个人计算机已走进千家万户,彻底改变了人们的生活方式。计算机主要由两部分组成,一部分是硬件系统,一部分是软件系统。近几十年来,计算机硬件性能的提升遵循着摩尔定律--每18个月翻一番,而计算机软件也总会适时地吃掉所有性能,并渴望着更高的计算效率。从最初需要穿孔纸或卡片来进行数据的输入输出、使用人工连线来更换程序的计算机发展初期,到如今的人们只需要简单地使用键鼠就能进行各种各样的复杂操作,计算机软件也在一步步的更新换代。从一开始,人们需要使用汇编语言来进行程序编写,到如今众多高级语言的诞生,编程的准入门槛越来越低,各种计算机语言的社区也是一片欣欣向荣,人们拥有了更多的时间来关注他们所要实现的具体业务,而不必困扰于如何进行实现。

如今使用最为广泛的高级编程语言主要以Python、C、Java、C++以及C#为主,下图展示了TIOBE所统计的Top 10编程语言走势。Python以其易用性吸引了越来越多的编程人员,不过鉴于解释型语言的特性,其性能一直为人所诟病。不过,随着版本的更迭,Python开发人员也越来越关注性能上的提升,尤其是最近几个版本的发布,能够明显地看到程序运行效率的提升。近期,Python 3.11正式版发布在即,根据官方数据显示,Python 3.11 比Python 3.10 快 10~60%,基准组件加速了1.22倍。

Top 10 编程语言走势图

在这篇文章中,我们主要对近几个版本进行了性能测评对比,它们分别是3.7,3.8,3.9,3.10以及3.11.0rc1。为了更公平地比较,我们不仅使用了官方提供的pyperformance包进行了基准性能测试,同时还将测评任务与实际业务场景相结合,使用Python重写了阿里云-日志服务(SLS)数据加工任务中的部分算子,在将这些算子进行组合以进行数据加工的场景下进行了不同Python版本的性能测评。

Python性能演变

版本说明

当前,Python 3.11发布在即,官方表示该版本带来了极大的性能提升,在这篇文章中,我们测试了不同Python版本的性能表现,从而为项目中Python版本的升级提供一些参考意见。所测评的Python版本信息如下:

  • python 3.7
  • python 3.8
  • python 3.9
  • python 3.10
  • python 3.11.0rc1

测试方案

我们在阿里云ECS机器上部署了多个版本的Python,并使用官方提供的pyperformance包进行基准性能测试。pyperformance 项目旨在成为所有 Python 实现基准的权威来源。重点是真实世界的基准测试,而不是综合基准测试,尽可能使用整个应用程序。在运行pyperformance的时候,它会运行一套几十个的基准测试,并对结果进行了统计,降低了开发人员测试的难度。

任务场景介绍

基于pyperformance的性能测评

阿里云服务器(Elastic Compute Service, 简称ECS)是一种安全可靠、弹性可伸缩的云计算服务器,可以帮助公司、组织和个人构建更加安全稳定的应用,降低IT成本,提升运维效率,让相关人员更专注于核心业务的创新。如今,越来越多的应用服务部署于阿里云服务器上,在ECS上测评不同Python版本的性能对于众多的业务场景具有广泛的适用性。测评时所选用的ECS配置如下:

规格

2 vCPU 8 GiB (ecs.g7.large)

I/O优化

系统盘

ESSD云盘 40GiB,PL0(单盘IOPS性能上限1万)

操作系统

linux/CentOS 8.5 64位

通过官方提供的pyperformance包,我们对不同Python版本的性能进行了测试,所使用的方法为:

python3.* -m pyoerformance run -o python-3.*.json

其中 *表示Python版本,如7、8、9、10、11。为保证测评的公平性,在测评期间,除了pyperformance以及必要后台程序的运行,未运行其他任何程序。

Python各版本的性能表现

在下表中,我们统计了在ECS上Python高版本相对于Python 3.7的测试性能表现。从表中可以看到,python 3.8、python 3.9以及python 3.10性能相近且相对于python 3.7,性能都只有略微的提升,而到了python 3.11,其性能相对于python 3.7几何均值提高了41%。在性能对比测试的59个项目中,绝大多数情况下,随着版本的升高,性能都有着一定的提升,尤其是对于Python 3.11版本而言相较于Python 3.7,它仅在unpickle_list、scimark_sparse_mat_mult以及python_startup_no_site三个项目上具有略微的性能劣势,而在其他项目上都具有更好的性能表现,甚至在部分项目上,其性能的提升高达百分之百,如raytrace、scimark_sor、logging_silent等项目。

高版本与Python 3.7的性能对比


python 3.7

python 3.8

python 3.9

python 3.10

python 3.11.0rc1

faster num

-/-

44/59

48/59

49/59

55/59

Geometric mean

-

1.05x faster

1.05 faster

1.06x faster

1.41x faster

Mean

106 ms

87 ms

84 ms

89 ms

63 ms

我们从pyperformance测评的59个项目中选择了其中12个被使用频率较高的项目,然后在这些项目上比较了Python 3.8、Python 3.9、Python 3.10以及Python 3.11相对Python 3.7的性能表现,结果如下图所示,各个标记点表示对应版本在各个项目上的运行速率倍数,距离圆心越远表示性能表现越佳。从图中可以看到,Python 3.8、Python 3.9以及Python 3.10在大部分项目中相对于Python 3.7都有一定的性能提升,不过它们之间并没有明显的性能优势。而Python 3.11在多个项目中,都表现出了超强的性能,甚至在mako项目上,与Python 3.7相比,性能提高超过了百分之百。


模拟SLS数据加工场景

任务场景介绍

数据加工服务是阿里云SLS推出的面向日志ETL处理的服务,主要解决数据加工过程中转换、过滤、分发、富化等场景,其提供了Python语法子集作为用户使用接口。为了在具体业务场景中测试不同Python版本的性能,我们使用Python模拟了客户使用SLS数据加工完成nginx日志解析富化的过程。测评所使用的数据根据模板随机生成,样例如下所示:

bytes_sent:1195cookie_mbparentid:-cookie_mbstudentid:-cookie_parentId:-cookie_studentId:-env_name:alihost:internal.cms-admin.test.com.cnhostname:l-internal-nginx-nginx3.ops.prod.ali.dmhttp_authorization:-http_referer:-http_user_agent:Apache-HttpClient/4.5.13 (Java/1.8.0_212)
http_vk_session_id:-http_x_forwarded_for:10.245.79.157http_x_forwarded_proto:httpmsec:1662985712.423remote_addr:100.121.196.108remote_user:-request_method:GETrequest_method_r:GETrequest_protocol:HTTP/1.1request_time:0.008request_trace_id:internal.cms-admin.test.com.cn-6698-144280548015-0-1662985712.415request_trace_seq:0request_uri:/api/service/private/channel/find?id=14767550status:200time_local:12/Sep/2022:20:28:32upstream_addr:10.245.13.126:80upstream_connect_time:0.000upstream_response_time:0.008upstream_status:200

此次模拟的数据加工代码脚本如下:

e_rename(
"__raw__",
"message",
"host",
"http_host",
"request_uri",
"url",
"http_x_forwarded_proto",
"scheme",
)
e_regex("url", "([^?]+)\??.*", ["uri"])
e_set("domain", "nginx")
e_set("http_uri", str_format("http://{}{}", v("http_host"), v("uri")))
e_set("http_url", str_format("http://{}{}", v("http_host"), v("url")))
e_if(
e_has("time_local"),
e_compose(
e_set(
"source_timestamp",
dt_parsetimestamp(
dt_strptime(v("time_local"), "%d/%b/%Y:%H:%M:%S"), "Asia/Shanghai"            ),
        ),
e_set("__time__", v("source_timestamp")),
e_set(
"source_date",
dt_strftimestamp(v("source_timestamp"), fmt="%Y-%m-%d", tz="Asia/Shanghai"),
        ),
    ),
)
e_set("source_host", v("__source__"))
e_set("time_unit", "second")
e_set("upstream_bytes_received", "-")
e_set("upstream_bytes_sent", "-")
e_set("bytes_received", "-")
e_set(
"request",
str_format("{} {} {}", v("request_method"), v("url"), v("request_protocol")),
)
e_regex("__tag__:__path__", r"\S+/(?<project>\S+).log")
e_set("topic", str_format("nginx_{}", v("project")))
e_set("http_vk_session_id", v("env_name"))
e_set("tmp_str_split", str_split(v("request_trace_id"), "-"))
e_set("tmp_arr_len", op_len(json_parse(v("tmp_str_split"))))
e_if(
op_eq(v("tmp_arr_len"), "6"),
e_compose(
e_set("productId", lst_get(v("tmp_str_split"), 0)),
e_set("userId_hex", lst_get(v("tmp_str_split"), 1)),
e_set("appSessionId", lst_get(v("tmp_str_split"), 2)),
e_set("pageSessionId", lst_get(v("tmp_str_split"), 3)),
e_set("feSessionId", lst_get(v("tmp_str_split"), 4)),
e_set("traceId", lst_get(v("tmp_str_split"), 5)),
    ),
)
e_drop_fields(
"env_name",
"msec",
"request_method_r",
"request_protocol",
"tmp_arr_len",
"tmp_str_split",
)
e_if(
e_search("message:localhost"),
e_set("is_localhost", 1),
e_search("message:internal"),
e_set("is_internal", 1),
e_search("message:prod"),
e_set("is_prod", 1),
)

经过上述数据加工的结果如下所示:

appSessionId:6698bytes_received:-bytes_sent:1195cookie_mbparentid:-cookie_mbstudentid:-cookie_parentId:-cookie_studentId:-domain:nginxfeSessionId:0hostname:l-internal-nginx-nginx3.ops.prod.ali.dmhttp_authorization:-http_host:internal.cms-admin.test.com.cnhttp_referer:-http_uri:http://internal.cms-admin.test.com.cn/api/service/private/channel/findhttp_url:http://internal.cms-admin.test.com.cn/api/service/private/channel/find?id=14767550http_user_agent:Apache-HttpClient/4.5.13 (Java/1.8.0_212)
http_vk_session_id:alihttp_x_forwarded_for:10.245.79.157is_internal:1is_prod:1message:12/Sep/2022:20:28:32+0800|l-internal-nginx-nginx3.ops.prod.ali.dm|100.121.196.108|10.245.13.126:80|0.008|0.008|0.000|200|200|-|1195|-|-|-|GET/api/service/private/channel/find?id=14767550HTTP/1.1|Apache-HttpClient/4.5.13 (Java/1.8.0_212)|-|internal.cms-admin.test.com.cn|second|1662985712.423|^_^|http|GET|internal.cms-admin.test.com.cn-6698-144280548015-0-1662985712.415|0|^_^|10.245.79.157|-|-|-|-|-|ali|-pageSessionId:144280548015productId:internal.cmsremote_addr:100.121.196.108remote_user:-request:GET/api/service/private/channel/find?id=14767550HTTP/1.1request_method:GETrequest_time:0.008request_trace_id:internal.cms-admin.test.com.cn-6698-144280548015-0-1662985712.415request_trace_seq:0scheme:httpsource_date:2022-09-12source_host:fan-real-datasource_timestamp:1662985712status:200time_local:12/Sep/2022:20:28:32time_unit:secondtopic:nginx_NonetraceId:1662985712.415upstream_addr:10.245.13.126:80upstream_bytes_received:-upstream_bytes_sent:-upstream_connect_time:0.000upstream_response_time:0.008upstream_status:200uri:/api/service/private/channel/findurl:/api/service/private/channel/find?id=14767550userId_hex:admin.test.com.cn

在数据加工任务上性能对比

使用Python重写的算子构成的数据加工代码对 2,686,599 条数据进行相同的加工处理时,各个Python版本下数据加工效率如下表所示。


python 3.7

python 3.9

python 3.10

python 3.11

峰值/分钟

3.71 k

3.90 k

4.20 k

4.77 k

八分钟

1.72 Mil

1.74 Mil

1.81 Mil

2.06 Mil

从表中可以看到,随着python版本的升高,加工效率均有不同程度的提升,其中Python 3.9相对于Python 3.7的数据处理速度提高了大约1.16%,Python 3.10相对于Python 3.7性能提高了大约5.23%,而Python 3.11相对于Python 3.7的加工性能提高了大约19.77%,如此大幅的性能增强将带来对应的效率提升。

下图展示了在一次作业运行过程中,处理等量数据的情况下,各Python版本对于日志的处理速度。从图中可以看到,在该任务场景下Python 3.11的性能相较于其他版本具有明显的优势。首先是在启动速度方面,Python 3.11能够在更短的时间内启动并更快的达到最高的数据处理水平。与其他版本性能差距较小导致数据处理速度曲线纠缠在一起不同,Python 3.11版本的性能曲线与其他版本明显区隔开,可见性能优势较大。从中可以得到结论,在该业务场景下,无论是对少量数据进行处理的短时任务,还是对大量数据进行处理的长时任务,Python 3.11相较于其他版本均具有明显的性能优势。

结论

通过在两个任务场景上进行详细的性能测试,我们可以看到,Python 3.11确实如官方所言,在性能方面有了极大的提高。而在具体的业务场景--阿里云-日志服务(SLS)数据加工任务之上,Python 3.11的性能相较于Python 3.7提高了 20%左右。这意味着,在不改变其他条件的情况下,仅通过版本升级,就能给我们带来较大的效能提升。

附录

基于pyperformance的不同Python版本在ECS上性能对比表

python 3.7

python 3.8

python 3.9

python 3.10

python 3.11

crypto_pyaes

133 ms

128 ms

121 ms

126 ms

77 ms

django_template

69.3 ms

58.6 ms

59.6 ms

58.2 ms

38.3 ms

float

131 ms

139 ms

134 ms

120 ms

78 ms

json_dumps

14.9 ms

14.6 ms

14.4 ms

14.3 ms

13.1 ms

mako

21.5 ms

19.8 ms

18.4 ms

17.3 ms

10.6 ms

nqueens

121 ms

117 ms

112 ms

115 ms

97 ms

python_startup

10.3 ms

12.1 ms

10.5 ms

10.5 ms

9.8 ms

regex_compile

213 ms

197 ms

200 ms

202 ms

148 ms

spectral_norm

144 ms

151 ms

152 ms

159 ms

101 ms

xml_etree_process

106 ms

87 ms

84 ms

89 ms

63 ms

Mean

96.4 ms

92.4 ms

90.6 ms

91.1 ms

63.6 ms

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
机器学习/深度学习 数据采集 算法
Python AutoML框架选型攻略:7个工具性能对比与应用指南
本文系统介绍了主流Python AutoML库的技术特点与适用场景,涵盖AutoGluon、PyCaret、TPOT、Auto-sklearn、H2O AutoML及AutoKeras等工具,帮助开发者根据项目需求高效选择自动化机器学习方案。
380 1
|
6月前
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比
|
2月前
|
数据采集 存储 Web App开发
Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
本文深入解析Python爬虫库的性能与选型策略,涵盖需求分析、技术评估与实战案例,助你构建高效稳定的数据采集系统。
259 0
|
5月前
|
网络协议 API 开发者
分析http.client与requests在Python中的性能差异并优化。
合理地选择 `http.client`和 `requests`库以及在此基础上优化代码,可以帮助你的Python网络编程更加顺利,无论是在性能还是在易用性上。我们通常推荐使用 `requests`库,因为它的易用性。对于需要大量详细控制的任务,或者对性能有严格要求的情况,可以考虑使用 `http.client`库。同时,不断优化并管理员连接、设定合理超时和重试都是提高网络访问效率和稳定性的好方式。
124 19
|
4月前
|
网络协议 API Python
解析http.client与requests在Python中的性能比较和改进策略。
最后,需要明确的是,这两种库各有其优点和适用场景。`http.client` 更适合于基础且并行的请求,`requests` 则因其易用且强大的功能,更适用于复杂的 HTTP 场景。对于哪种更适合你的应用,可能需要你自己进行实际的测试来确定。
124 10
|
11月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
596 3
|
9月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
237 61
Python装饰器实战:打造高效性能计时工具
|
7月前
|
缓存 并行计算 数据处理
全面提升Python性能的十三种优化技巧
通过应用上述十三种优化技巧,开发者可以显著提高Python代码的执行效率和性能。每个技巧都针对特定的性能瓶颈进行优化,从内存管理到并行计算,再到使用高效的数值计算库。这些优化不仅能提升代码的运行速度,还能提高代码的可读性和可维护性。希望这些技巧能帮助开发者在实际项目中实现更高效的Python编程。
521 22
|
9月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
574 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
8月前
|
安全 数据处理 索引
深入探讨 Python 列表与元组:操作技巧、性能特性与适用场景
Python 列表和元组是两种强大且常用的数据结构,各自具有独特的特性和适用场景。通过对它们的深入理解和熟练应用,可以显著提高编程效率和代码质量。无论是在数据处理、函数参数传递还是多线程环境中,合理选择和使用列表与元组都能够使得代码更加简洁、高效和安全。
177 9

推荐镜像

更多