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

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

当谈到编程效率和性能优化时,Python 常常被调侃为“慢如蜗牛”

有趣的是,Python 代码在函数中运行往往比在全局范围内运行要快得多

小伙伴们可能会有这个疑问:为什么在函数中运行的 Python 代码速度更快?

今天这篇文章将会解答大家心中的疑惑

原文链接:https://stackabuse.com/why-does-python-code-run-faster-in-a-function/

译文

要理解为什么 Python 代码在函数中运行得更快,我们需要首先了解 Python 是如何执行代码的

我们知道,python 是一种解释型语言,它会逐行读取并执行代码

当运行一个 python 程序的时候,首先将代码编译成字节码(一种更接近机器码的中间语言)然后 python 解释器执行字节码

由上所示,python 中的 dis 模块将函数 hello_world 分解为字节码

需要注意的是,python 解释器是一个执行字节码的虚拟机,默认的 python 解释器是用 C 编写的,即 CPython

还有其他的 python 解释器如 Jython(用 Java 编写),IronPython(用于 .net)和PyPy(用 Python 和 C 编写)

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

我们来编写一个简单的例子:定义一个函数 my_function,函数内部包含一个 for 循环

编译该函数的时候,字节码可能如下所示

这里的关键指令是 STORE_FAST ,用于存储循环变量 i

现在我们把这个 for 循环放在 python 脚本的顶层(全局范围内),然后再来看一下字节码

可以看到关键指令变成了 STORE_NAME,而不是 STORE_FAST

字节码 STORE_FASTSTORE_NAME 快,因为在函数中,局部变量存储在固定长度的数组中,而不是存储在字典中。这个数组可以通过索引直接访问,使得变量检索非常快

基本上,它只是一个指向列表的指针,并增加了 PyObject 的引用计数,这两个都是高效的操作

另一方面,全局变量存储在一个字典。当访问全局变量时,Python 必须执行哈希表查找,这涉及计算哈希值,然后检索与之关联的值

虽然经过优化,但仍然比基于索引的查找慢

基准测试验证

我们知道在 Python 中,代码执行的速度取决于代码执行的位置——在函数中还是在全局作用域中

让我们用一个简单的基准测试的例子来比较一下

首先定义一个求阶乘的函数

然后在全局范围内执行相同的代码

为了对这两段代码进行基准测试,我们可以在 Python 中使用 timeit 模块,它提供了一种简单的方法来对少量 Python 代码进行计时

可以看到,函数代码的执行速度比全局作用域代码要快

需要注意的是,这两段代码最好不要放在同一脚本中,要分开单独运行

这是因为 benchmark() 函数在执行时间上增加了一些开销,并且全局代码在内部进行了优化

cProfile 分析

python 提供了一个 cProfile 内置模块

让我们用它来分析一个新例子:在局部和全局范围内计算平方和

上面的例子中,可以认为sum_of_squares_g() 函数是全局的,因为它使用了两个全局变量, itotal

从性能分析结果中,可以看到函数代码在执行时间方面比全局更有效

如何优化 python 函数的性能

前面我们知道,Python 代码在函数中运行往往比在全局范围内运行要快得多

如果想要进一步提高 python 函数代码效率,不妨考虑一下使用局部变量而不是全局变量

另一种方法是尽可能使用内置函数和库。Python 的内置函数是用 C 实现的,比 Python 快得多

比如 NumPy 和 Pandas,也是用 C 或 C++ 实现的,它们比实现同样功能的 Python 代码速度更快

又比如同样是实现数字求和的功能,python 内置的 sum 函数要比你自己编写函数速度更快

学习资源推荐

除了上述分享,如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。

这里给大家展示一下我进的兼职群和最近接单的截图

兼职群

私单

😝朋友们如果有需要的话,可以V扫描下方二维码联系领取

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

image-20230619144606466

因篇幅有限,仅展示部分资料,添加上方即可获取
一、Python学习路线

image-20230619144606466

python学习路线图1

二、Python基础学习
1. 开发工具

2. 学习笔记

在这里插入图片描述

3. 学习视频

在这里插入图片描述

三、Python小白必备手册

图片

四、数据分析全套资源

在这里插入图片描述

五、Python面试集锦
1. 面试资料

在这里插入图片描述

在这里插入图片描述

2. 简历模板

在这里插入图片描述
😝朋友们如果有需要的话,可以V扫描下方二维码联系领取

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

image-20230619144606466

因篇幅有限,仅展示部分资料,添加上方即可获取
------ 🙇‍♂️ 本文转自网络,如有侵权,请联系删除 🙇‍♂️ ------
论文工具——写论文好用的绘图工具(甘特图+流程图+网络模型图+泳道图) * 在写HiFi-GAN论文的代码阅读过程中,我发现仅仅通过文字来描述网络结构,不够详细,所以想绘制出网络结构图,更加具象化的描述出网络结构。想去花了,才发现之前都是通过在线绘图网站画的,费时费力,所以想找一些专门的网站化出比较规范并且高质量的图。一方面是为了方便讲解,提高论文的质量,另外一方面也是为了以后写论文打下良好的基础。 * 这篇文章会根据我以前的画图经验展开,以前是使用绘图软件,手动绘图。后来,看到了其他的方,但是需要写一些代码,或者需要安装特定的软件,投入成本太大,就没有学。所以,本文分享的工 阅读详情

相关推荐

【LIN总线测试】——LIN主节点数据链路层测试

LIN总线是基于UART/SCI(通用异步收发器/串行接口)的低成本串行通讯协议。其目标定位于车身网络模块节点间的低端通信,主要用于智能传感器和执行器的串行通信,而这正是CAN总线的带宽和功能所不要求的部分。本章节主要介绍LIN主节点数据链路层如何测试?

测试领域技术分享 2585

Python 中,代码函数运行为什么在全局中运行

因为CPython的解释器实现细节。CPython的解释器,对局部变量是用数组存储,用下标来访问;而对全局变量是用dict来存储,用符号(symbol)来做hash访问。速度差距是杠杠的。这是因为一旦函数定义好之后,局部变量的个数就不能改了,所以可以用固定大小的容器存储;而全局名字是可以一边执行一边改变的,所以得用更动态的方式来存储。看CPython的字节码的 LOAD_FAST 与 LOAD_G...

多频传媒 561

LDRA Testbed软件静态分析_常见问题及处理

通过前面的几篇文章,LDRA Testbed软件静态分析的内容基本讲解完了,本篇文章将针对使用Testbed进行软件静态分析的常见问题进行介绍。 到此为止,LDRA Testbed软件静态分析的内容已经全部讲完,如果有问题,欢迎私信提问(不经常登录,回复可能不及时,见谅)。下一篇文章将开始讲解如何使用Testbed进行单元测试。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 2533

python中用函数可以提高代码运行速度吗_为什么Python代码函数运行更快?...

发现如果python代码正常运行,然后在python函数运行,则在后一种情况下运行速度更快。我想知道为什么python代码函数运行更快。通常发现在python函数中存储局部变量要比全局变量更快。可以解释如下。除了局部/全局变量存储时间外,操作码预测还使函数运行更快。CPython是我们从Python.org下载的原始Python实现。它被称为CPython,以将其与更高版本的Python实...

weixin_39806288的博客 2314

为什么Python代码函数运行更快

def main(): for i in xrange(10**8): pass main() This piece of code in Python runs in (

xfxf996的博客 654

python运行,为什么Python代码函数运行更快

def main():for i in xrange(10**8):passmain()This piece of code in Python runs in (Note: The timing is done with the time function in BASH in Linux.)real 0m1.841suser 0m1.828ssys 0m0.012sHow...

weixin_42527464的博客 108

python运行_为什么Python代码函数运行更快

def main():for i in xrange(10**8):passmain()This piece of code in Python runs in (Note: The timing is done with the time function in BASH in Linux.)real 0m1.841suser 0m1.828ssys 0m0.012sHow...

weixin_39796652的博客 114

python函数可以提高代码执行速度吗_为什么Python代码函数运行更快

除了本地/全局变量存储时间,操作码预测使函数更快。正如其他答案所解释的,函数在循环中使用STORE_FAST操作码。下面是函数循环的字节码:>> 13 FOR_ITER 6 (to 22) # get next value from iterator16 STORE_FAST 0 (x) # set local var...

weixin_39874379的博客 3161

python为什么函数代码会比全局书写运行更快

最近有同事提了一个有意思的问题. “同一段代码函数运行要比直接书写运行更快for i in xrange(10**8): pass今天查了资料,发现其实蛮有意思的. 其本质是局部变量的操作速度要于全局变量. python代码运行之前会编译为字节码(.pyc),可以发现两段代码的差异就是局部变量和全局变量的差异,局部变量采用STORE_FAST的方式操作,全局变量只能采用ST

yyw794的专栏 960

just函数python_用 PyPy 让你的 Python 代码运行更快

Python开发人员中最常用的编程语言之一,但它有一定的局限性。例如,对于某些应用程序而言,它的运行速度可能比其它语言低100倍。这就是为什么Python运行速度成为用户瓶颈后,许公司会用另一种语言重写他们的应用程序。但是有没有一种方既可以保持Python的特性又能提高速度呢?它就是PyPyPyPy是一种非常兼容的Python解释器,它是CPython2.7、3.6和即将推出...

weixin_39867662的博客 154

python 调用函数 开销_为什么Python代码函数运行更快

除了本地/全局变量存储时间之外,操作码预测使功能更快。正如其他答案所解释的,该函数使用STORE_FAST循环中的操作码。下面是函数循环的字节码:>>13FOR_ITER6(to22)#getnextvaluefromiterator16STORE_FAST0(x)#set...

weixin_39629352的博客 268

python函数提高代码执行速度吗_为什么Python代码在一个函数运行更快

匿名用户除了局部/全局变量存储时间外,操作码预测使函数更快。正如其他答案所解释的,该函数在循环中使用store_fast操作码。下面是函数循环的字节码:>> 13 FOR_ITER 6 (to 22) # get next value from iterator16 STORE_FAST 0 (x) # s...

weixin_39962285的博客 719

python内部函数和比外部函数_为什么Python函数中,代码运行速度更快

展开全部Julia 与 Python的比较我是否应丢弃62616964757a686964616fe4b893e5b19e31333363393565 Python 和其他语言,使用 Julia 执行技术计算?在看到 上的基准测试后,人们一定会这么想。Python和其他高级语言在速度上远远有些落后。但是,我想到的第一个问题有所不同:Julia 团队能否以最适合 Python 的方式编写 Pytho...

weixin_39586353的博客 576

python函数可以提高代码执行速度吗_为什么Python函数中,代码运行速度更快...

匿名用户1级2017-11-02 回答Julia 与 Python的比较我是否应丢弃 Python 和其他语言,使用 Julia 执行技术计算?在看到 上的基准测试后,人们一定会这么想。Python和其他高级语言在速度上远远有些落后。但是,我想到的第一个问题有所不同:Julia 团队能否以最适合 Python 的方式编写 Python 基准测试?我对这种跨语言比较的观点是,应该根据要执行的任务来定...

weixin_39908263的博客 242

python函数可以提高代码执行速度吗_请问为什么Python函数中,代码运行速度更快?...

Julia 与 Python的比较我是否应丢弃 Python 和其他语言,使用 Julia 执行技术计算?在看到 上的基准测试后,人们一定会这么想。Python和其他高级语言在速度上远远有些落后。但是,我想到的第一个问题有所不同:Julia 团队能否以最适合 Python 的方式编写 Python 基准测试?我对这种跨语言比较的观点是,应该根据要执行的任务来定义基准测试,然后由语言专家编写执行这些...

weixin_39665787的博客 331

python函数能否提高代码执行速度_性能 - 为什么Python代码函数运行更快?...

除了本地/全局变量存储时间,操作码预测使功能更快。正如其他答案所解释的那样,该函数在循环中使用了PREDICT操作码。 这是函数循环的字节码:>> 13 FOR_ITER 6 (to 22) # get next value from iterator16 STORE_FAST 0 (x) # set lo...

weixin_33293612的博客 2246
上一篇: 听说你需要一份Python的入门指南?快来收藏吧!
下一篇: Python全系列教程完整版(懂中文就能学会)
大模型应用场景
博客等级 码龄5年 7237粉丝 1351原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值