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

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
24 2
|
1月前
|
测试技术 持续交付 Apache
性能怪兽来袭!Python+JMeter+Locust,让你的应用性能飙升🦖
【8月更文挑战第5天】随着互联网应用规模增长,性能测试至关重要。本文介绍如何利用Python结合Apache JMeter和Locust构建高效可定制的性能测试框架。JMeter广泛用于负载测试,通过模拟大量虚拟用户并发访问来评估性能。Locust基于Python,通过编写简单脚本模拟HTTP请求,特别适合Web应用测试,比JMeter更灵活易扩展。Python作为胶水语言简化测试脚本编写并流畅自动化流程。文章提供JMeter命令行测试和Locust脚本示例,并展示如何用Python自动化执行和整合测试结果,最终帮助应用在高负载下稳定运行。
55 1
|
1月前
|
程序员 数据库连接 API
分享一个解决 EF 性能低的思路,通过 Python 访问心跳侦测 API 保持 EF 在线
分享一个解决 EF 性能低的思路,通过 Python 访问心跳侦测 API 保持 EF 在线
|
2月前
|
存储 缓存 算法
python性能问题(Performance Issues)
【7月更文挑战第19天】
46 5
python性能问题(Performance Issues)
|
1月前
|
监控 Java 测试技术
实战派必看!Python性能测试中,JMeter与Locust如何助力性能调优
【8月更文挑战第6天】性能优化是软件开发的关键。本文介绍JMeter与Locust两款流行性能测试工具,演示如何用于Python应用的性能调优。JMeter可模拟大量用户并发访问,支持多种协议;Locust用Python编写,易于定制用户行为并模拟高并发。根据场景选择合适工具,确保应用在高负载下的稳定运行。
82 4
|
1月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【8月更文挑战第6天】在数字化时代,确保软件在高并发下的稳定性至关重要。Python 提供了强大的性能测试工具,如 JMeter 和 Locust。JMeter 可配置复杂请求场景,而 Locust 则以 Python 脚本灵活模拟真实用户行为。两者结合,可全面评估系统性能。例如,对电商网站进行测试时,JMeter 模拟登录请求,Locust 定义浏览和购物行为,共同揭示系统瓶颈并指导优化,从而保证稳定高效的用户体验。
69 1
|
22天前
|
监控 Java Serverless
Serverless 应用的监控与调试问题之PyFlink对于Python UDF的性能如何提升
Serverless 应用的监控与调试问题之PyFlink对于Python UDF的性能如何提升
|
2月前
|
存储 缓存 算法
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是关键考量,需精妙平衡以优化程序性能。时间复杂度反映算法随输入规模增长的执行时间趋势,空间复杂度关注额外存储需求。线性搜索O(n)时间,O(1)空间;二分搜索O(log n)时间,O(1)空间,提升效率;动态规划如斐波那契数列O(n)时间与空间,利用存储减小计算。实际应用需按场景需求调整,如实时数据偏重时间,资源受限环境优先考虑空间。平衡两者,理解算法本质,结合实践,创造高性能程序。
36 7
|
2月前
|
机器学习/深度学习 存储 数据可视化
特征选择的艺术:利用Scikit-learn提升模型性能
【7月更文第22天】在机器学习的实践中,特征选择是一项至关重要的步骤,它直接影响到模型的性能、训练速度以及对新数据的泛化能力。特征选择,或称为变量选择,旨在从原始特征集中识别并保留最相关、最有影响力的特征子集,同时剔除冗余或无关紧要的特征。本文将探讨特征选择的重要性,并通过使用Python中的Scikit-learn库演示几种有效的特征选择方法,以提升模型性能。
101 4
|
1月前
|
并行计算 开发者 Python
解锁Python多进程编程的超能力:并行计算的魔法与奇迹,探索处理器核心的秘密,让程序性能飞跃!
【8月更文挑战第12天】在Python编程领域,多进程编程是一项关键技能,能有效提升程序效率。本文通过理论与实践结合,深入浅出地介绍了Python中的多进程编程。首先解释了多进程的概念:即操作系统中能够并发执行的多个独立单元,进而提高整体性能。接着重点介绍了`multiprocessing`模块,演示了如何创建和启动进程,以及进程间的通信方式,如队列等。此外,还提到了更高级的功能,例如进程池管理和同步原语等。通过这些实例,读者能更好地理解如何在实际项目中利用多核处理器的优势,同时注意进程间通信和同步等问题,确保程序稳定高效运行。
30 0