匿名用户

除了局部/全局变量存储时间外,操作码预测使函数更快。

正如其他答案所解释的,该函数在循环中使用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代码在一个函数中运行得更快?相关推荐

  1. C++中如何控制语句只执行一次_【Python基础(七)】逻辑控制

    本节将会讲到在编程中个人认为最重要的知识之一,逻辑控制.与其说是介绍语法,不如说是阐述看待事物的方法.我们身处的世界,每天有海量信息向我们袭来,每天我们要处理若干的事件,对于每一个事件,它都由若干个小 ...

  2. 中如何对一个数取余_如何找到自己在一个城市中的定位?

    更多资讯,关注微信公众号:好房U购四川. 如何找到自己在一个城市中的定位? 最近,各大企业都纷纷启动了校招工作.有条件的,全国都在跑:至少,川内都要跑一跑. 而毕业生最迷茫的,不过这两个问题: 北上广 ...

  3. 用 PyPy 让你的 Python 代码运行得更快!

    Python是开发人员中最常用的编程语言之一,但它有一定的局限性.例如,对于某些应用程序而言,它的运行速度可能比其它语言低100倍.这就是为什么当Python的运行速度成为用户瓶颈后,许多公司会用另一 ...

  4. python pypy_Python之父的加速秘籍:PyPy能让代码运行得更快!

    全文共2179字,预计学习时长6分钟 图源:unsplash 当我们提及Python时,常常指的是CPython,即C语言实现的Python,这就是PyPy发挥作用的地方啦.实话讲,Python很慢, ...

  5. 如果我针对大小而不是速度进行优化,为什么GCC会生成15-20%的更快代码?

    本文翻译自:Why does GCC generate 15-20% faster code if I optimize for size instead of speed? I first noti ...

  6. python中的数组与列表的区别_在python中,如何将数组/列表与numb进行比较

    您的代码:array = [] while len(array) < 1000: i=2 if i%array == 0: append.array(i) i = i + 1 print arr ...

  7. python函数可以提高代码执行速度吗_Python代码运行速度慢?这五种方法很管用

    对于Python很多人还是比较了解的,虽然说Python有很多优势但同样具有劣势,Python最大的劣势就是运行效率慢,那么如何提高Python代码运行速度呢?这五种方法很管用. 1.PyPy:在选择 ...

  8. python可以提高程序执行速度N倍你知道吗?

    1.1.Numba的约5分钟指南 Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码.使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numb ...

  9. python.freelycode.com-优化Pandas代码执行速度入门指南

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 如果你用Python做过一些数据分析相关的项目,那么很有可能你已经接触过Pandas,由Wrs McKin ...

最新文章

  1. 全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?
  2. numpy.mod详解
  3. 男人是大猪蹄子的证据找到了!
  4. oracle实验六杨艳华_oracle实验报告总结
  5. 车架号查车辆型号_【菜鸟二手车大讲堂】第十一讲 经常提到的汽车车架号是什么?...
  6. 微软警告:警惕新型勒索软件 PonyFinal,已现身印度、伊朗和美国
  7. 201771010126 王燕《面向对象设计 java》第十五周实验总结
  8. pluto.ctl_Apache Pluto,Portlet Bridge和JSF 2.0集成示例教程
  9. LTE学习笔记:频带、信道带宽和频点号EARFCN
  10. 高格虚拟服务器,网络相关 篇一:利用Windows自带的HyperV,安装高恪x86软路由
  11. SQL2000中文版打不上SP4提示用户验证没有通过
  12. 前端开发——浏览器插件推荐
  13. 服务器与操作系统的区别是什么,服务器系统和普通用户操作系统有何区别
  14. jquery—addClass方法和removeClass方法
  15. java: Compilation failed: internal java compiler error
  16. 计算机控制实验ppt模板,计算机控制技术实验课件.ppt
  17. 关于CSDN博客广告过多的解决办法
  18. Java实现从Excel文件转换成XML文件(一)
  19. 关于使用Intellij Idea时java系统找不到指定文件的解决方案
  20. 千锋逆战班学员教你从零基础了解HTML5的知识

热门文章

  1. win10 安装selenium和使用
  2. 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持
  3. SQLServer之创建唯一聚集索引
  4. ubuntu 12.04解决Broadcom STA无线网卡驱动安装失败解决
  5. WSUS 转发邮件中继到Office365
  6. web性能测试分析-工具篇 (转载)
  7. Mac下文件的编码及修改编码
  8. oracle like 条件拼接
  9. 大量多风格多功能后台管理模板
  10. mybatis批量插入oracle报表达式,mybatis oracle两种方式批量插入数据