python中函数提高代码执行速度吗_为什么Python代码在一个函数中运行得更快?
匿名用户
除了局部/全局变量存储时间外,操作码预测使函数更快。
正如其他答案所解释的,该函数在循环中使用store_fast操作码。下面是函数循环的字节码:>> 13 FOR_ITER 6 (to 22) # get next value from iterator
16 STORE_FAST 0 (x) # set local variable
19 JUMP_ABSOLUTE 13 # back to FOR_ITER
通常,当程序运行时,Python会一个接一个地执行每个操作码,跟踪a堆栈,并在每个操作码执行后对堆栈帧进行其他检查。操作码预测意味着在某些情况下,Python能够直接跳转到下一个操作码,从而避免了一些开销。
在这种情况下,每次Python看到for_iter(循环的顶部)时,它都会“预测”store_fast是它必须执行的下一个操作码。然后,Python查看下一个操作码,如果预测正确,则直接跳到store_fast。这具有将两个操作码压缩为单个操作码的效果。
另一方面,store_name操作码在全局级别的循环中使用。当Python看到这个操作码时,它不会做出类似的预测。相反,它必须返回到计算循环的顶部,这对循环的执行速度有明显的影响。
为了给出有关这种优化的更多技术细节,下面引用ceval.c文件(Python虚拟机的“引擎”):
有些操作码倾向于成对出现,因此当第一个代码运行时,可以预测第二个代码。例如,get_iter后面经常跟着for_iter。而且for_iter后面通常是store_fast或unpack_sequence。
验证预测需要对寄存器变量进行一次针对常数的高速测试。如果配对良好,那么处理器自己的内部分支预测成功的可能性很高,从而导致几乎零开销地过渡到下一个操作码。一个成功的预测节省了通过eval-loop(包括它的两个不可预测分支,has_arg测试和开关情况)的行程。与处理器的内部分支预测相结合,成功的predict具有使两个操作码运行的效果,就像它们是一个单独的带有主体组合的新操作码一样。
我们可以在for_iter操作码的源代码中看到预测store_fast的确切位置:case FOR_ITER: // the FOR_ITER opcode case
v = TOP();
x = (*v->ob_type->tp_iternext)(v); // x is the next value from iterator
if (x != NULL) {
PUSH(x); // put x on top of the stack
PREDICT(STORE_FAST); // predict STORE_FAST will follow - success!
PREDICT(UNPACK_SEQUENCE); // this and everything below is skipped
continue;
}
// error-checking and more code for when the iterator ends normally
如果(*next_instr==op)转到pred_##op,则predict函数将扩展为,即跳转到预测操作码的开始。在这种情况下,我们跳到这里:PREDICTED_WITH_ARG(STORE_FAST);
case STORE_FAST:
v = POP(); // pop x back off the stack
SETLOCAL(oparg, v); // set it as the new local variable
goto fast_next_opcode;
现在设置了局部变量,下一个操作码开始执行。Python继续通过迭代程序,直到它到达最后,每次都成功地进行预测。
Python wiki页面有更多关于CPython虚拟机如何工作的信息。
python中函数提高代码执行速度吗_为什么Python代码在一个函数中运行得更快?相关推荐
- C++中如何控制语句只执行一次_【Python基础(七)】逻辑控制
本节将会讲到在编程中个人认为最重要的知识之一,逻辑控制.与其说是介绍语法,不如说是阐述看待事物的方法.我们身处的世界,每天有海量信息向我们袭来,每天我们要处理若干的事件,对于每一个事件,它都由若干个小 ...
- 中如何对一个数取余_如何找到自己在一个城市中的定位?
更多资讯,关注微信公众号:好房U购四川. 如何找到自己在一个城市中的定位? 最近,各大企业都纷纷启动了校招工作.有条件的,全国都在跑:至少,川内都要跑一跑. 而毕业生最迷茫的,不过这两个问题: 北上广 ...
- 用 PyPy 让你的 Python 代码运行得更快!
Python是开发人员中最常用的编程语言之一,但它有一定的局限性.例如,对于某些应用程序而言,它的运行速度可能比其它语言低100倍.这就是为什么当Python的运行速度成为用户瓶颈后,许多公司会用另一 ...
- python pypy_Python之父的加速秘籍:PyPy能让代码运行得更快!
全文共2179字,预计学习时长6分钟 图源:unsplash 当我们提及Python时,常常指的是CPython,即C语言实现的Python,这就是PyPy发挥作用的地方啦.实话讲,Python很慢, ...
- 如果我针对大小而不是速度进行优化,为什么GCC会生成15-20%的更快代码?
本文翻译自:Why does GCC generate 15-20% faster code if I optimize for size instead of speed? I first noti ...
- python中的数组与列表的区别_在python中,如何将数组/列表与numb进行比较
您的代码:array = [] while len(array) < 1000: i=2 if i%array == 0: append.array(i) i = i + 1 print arr ...
- python函数可以提高代码执行速度吗_Python代码运行速度慢?这五种方法很管用
对于Python很多人还是比较了解的,虽然说Python有很多优势但同样具有劣势,Python最大的劣势就是运行效率慢,那么如何提高Python代码运行速度呢?这五种方法很管用. 1.PyPy:在选择 ...
- python可以提高程序执行速度N倍你知道吗?
1.1.Numba的约5分钟指南 Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码.使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numb ...
- python.freelycode.com-优化Pandas代码执行速度入门指南
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 如果你用Python做过一些数据分析相关的项目,那么很有可能你已经接触过Pandas,由Wrs McKin ...
最新文章
- 全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?
- numpy.mod详解
- 男人是大猪蹄子的证据找到了!
- oracle实验六杨艳华_oracle实验报告总结
- 车架号查车辆型号_【菜鸟二手车大讲堂】第十一讲 经常提到的汽车车架号是什么?...
- 微软警告:警惕新型勒索软件 PonyFinal,已现身印度、伊朗和美国
- 201771010126 王燕《面向对象设计 java》第十五周实验总结
- pluto.ctl_Apache Pluto,Portlet Bridge和JSF 2.0集成示例教程
- LTE学习笔记:频带、信道带宽和频点号EARFCN
- 高格虚拟服务器,网络相关 篇一:利用Windows自带的HyperV,安装高恪x86软路由
- SQL2000中文版打不上SP4提示用户验证没有通过
- 前端开发——浏览器插件推荐
- 服务器与操作系统的区别是什么,服务器系统和普通用户操作系统有何区别
- jquery—addClass方法和removeClass方法
- java: Compilation failed: internal java compiler error
- 计算机控制实验ppt模板,计算机控制技术实验课件.ppt
- 关于CSDN博客广告过多的解决办法
- Java实现从Excel文件转换成XML文件(一)
- 关于使用Intellij Idea时java系统找不到指定文件的解决方案
- 千锋逆战班学员教你从零基础了解HTML5的知识