当前位置:首页 > 科技  > 软件

为什么 Python 代码在函数中运行得更快?

来源: 责编: 时间:2023-09-20 21:54:44 463观看
导读要理解为什么 Python 代码在函数中运行得更快,我们需要首先了解 Python 是如何执行代码的我们知道,python 是一种解释型语言,它会逐行读取并执行代码当运行一个 python 程序的时候,首先将代码编译成字节码(一种更接近机器

要理解为什么 Python 代码在函数中运行得更快,我们需要首先了解 Python 是如何执行代码的tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

我们知道,python 是一种解释型语言,它会逐行读取并执行代码tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

当运行一个 python 程序的时候,首先将代码编译成字节码(一种更接近机器码的中间语言)然后 python 解释器执行字节码tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

由上所示,python 中的 dis 模块将函数 hello_world 分解为字节码tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

需要注意的是,python 解释器是一个执行字节码的虚拟机,默认的 python 解释器是用 C 编写的,即 CPythontsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

还有其他的 python 解释器如 Jython(用 Java 编写),IronPython(用于 )和PyPy(用 Python 和 C 编写)tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

为什么 python 代码在函数中运行得更快

tsF28资讯网——每日最新资讯28at.com

我们来编写一个简单的例子:定义一个函数 my_function,函数内部包含一个 for 循环tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

编译该函数的时候,字节码可能如下所示tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

这里的关键指令是 STORE_FAST ,用于存储循环变量 i tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

现在我们把这个 for 循环放在 python 脚本的顶层(全局范围内),然后再来看一下字节码tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

可以看到关键指令变成了 STORE_NAME,而不是 STORE_FAST tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

字节码 STORE_FAST比 STORE_NAME 快,因为在函数中,局部变量存储在固定长度的数组中,而不是存储在字典中。这个数组可以通过索引直接访问,使得变量检索非常快tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

基本上,它只是一个指向列表的指针,并增加了 PyObject 的引用计数,这两个都是高效的操作tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

另一方面,全局变量存储在一个字典。当访问全局变量时,Python 必须执行哈希表查找,这涉及计算哈希值,然后检索与之关联的值tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

虽然经过优化,但仍然比基于索引的查找慢tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

基准测试验证

tsF28资讯网——每日最新资讯28at.com

我们知道在 Python 中,代码执行的速度取决于代码执行的位置——在函数中还是在全局作用域中tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

让我们用一个简单的基准测试的例子来比较一下tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

首先定义一个求阶乘的函数tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

然后在全局范围内执行相同的代码tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

为了对这两段代码进行基准测试,我们可以在 Python 中使用 timeit 模块,它提供了一种简单的方法来对少量 Python 代码进行计时tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

可以看到,函数代码的执行速度比全局作用域代码要快tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

需要注意的是,这两段代码最好不要放在同一脚本中,要分开单独运行tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

这是因为 benchmark() 函数在执行时间上增加了一些开销,并且全局代码在内部进行了优化tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

cProfile 分析tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

python 提供了一个  cProfile 内置模块tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

让我们用它来分析一个新例子:在局部和全局范围内计算平方和tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

上面的例子中,可以认为sum_of_squares_g() 函数是全局的,因为它使用了两个全局变量, i 和 totaltsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

从性能分析结果中,可以看到函数代码在执行时间方面比全局更有效tsF28资讯网——每日最新资讯28at.com

图片图片tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

如何优化 python 函数的性能

tsF28资讯网——每日最新资讯28at.com

前面我们知道,Python 代码在函数中运行往往比在全局范围内运行要快得多tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

如果想要进一步提高 python 函数代码效率,不妨考虑一下使用局部变量而不是全局变量tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

另一种方法是尽可能使用内置函数和库。Python 的内置函数是用 C 实现的,比 Python 快得多tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

比如 NumPy 和 Pandas,也是用 C 或 C++ 实现的,它们比实现同样功能的 Python 代码速度更快tsF28资讯网——每日最新资讯28at.com

tsF28资讯网——每日最新资讯28at.com

又比如同样是实现数字求和的功能,python 内置的 sum 函数要比你自己编写函数速度更快tsF28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-10609-0.html为什么 Python 代码在函数中运行得更快?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用二进制字面量在现代C++中的应用

下一篇: 数据组合利器:从入门到精通Python中的zip()函数应用

标签:
  • 热门焦点
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现“美团直播”的固定入口。在直播聚合页面,外卖“神枪手”直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 信通院:小米、华为等11家应用商店基本完成APP签名及验签工作

    中国信通院表示,目前,小米、华为、OPPO、vivo、360手机助手、百度手机助手、应用宝、豌豆荚和努比亚等9家应用商店,以及抖音和快手2家新型应用分发平
  • 机构称Q2全球智能手机出货量同比下滑11% 苹果份额依旧第2

    7月20日消息,据外媒报道,研究机构的报告显示,由于需求下滑,今年二季度全球智能手机的出货量,同比下滑了11%,三星、苹果等主要厂商的销量,较去年同期均有下
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top