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

除了本地/全局变量存储时间,操作码预测使功能更快。

正如其他答案所解释的那样,该函数在循环中使用了PREDICT操作码。 这是函数循环的字节码:

>> 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会一个接一个地执行每个操作码,跟踪堆栈并在执行每个操作码后对堆栈帧执行其他检查。 操作码预测意味着在某些情况下Python能够直接跳转到下一个操作码,从而避免了一些开销。

在这种情况下,每当Python看到PREDICT(循环的顶部)时,它将“预测”if (*next_instr == op) goto PRED_##op是它必须执行的下一个操作码。 Python然后查看下一个操作码,如果预测正确,它会直接跳到UNPACK_SEQUENCE.这会将两个操作码压缩成一个操作码。

另一方面,PREDICT操作码用于全局级别的循环中。 当它看到这个操作码时,Python不*做出类似的预测。 相反,它必须回到评估循环的顶部,这对循环执行的速度有明显的影响。

要提供有关此优化的更多技术细节,请参阅PREDICT文件(Python虚拟机的“引擎”):

一些操作码倾向于成对出现,因此可以实现    在第一个代码运行时预测第二个代码。 例如,    PREDICT之后是if (*next_instr == op) goto PRED_##op.这个数字通常是PREDICT。    其次是if (*next_instr == op) goto PRED_##op或UNPACK_SEQUENCE。

验证预测需要对寄存器进行单次高速测试       变量对应常数。 如果配对很好,那么       处理器自己的内部分支预测具有很高的可能性       成功,导致几乎零开销过渡到       下一个操作码。 成功的预测可以通过eval-loop节省行程       包括其两个不可预测的分支,PREDICT测试和      切换情况。 结合处理器的内部分支预测,       成功的if (*next_instr == op) goto PRED_##op具有使两个操作码运行的效果       它们是一个新的操作码,其中的主体组合在一起。

我们可以在PREDICT操作码的源代码中看到PREDICT的预测:

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

PREDICT函数扩展为if (*next_instr == op) goto PRED_##op,即我们只是跳转到预测操作码的开头。 在这种情况下,我们跳到这里:

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维基页面提供了有关CPython虚拟机如何工作的更多信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值