Python 有分支预测吗?

jap*_*aps 5 python branch-prediction

我在 Python 中实现了一个物理模拟(大部分繁重的工作都是在数值库中完成的,因此性能足够好)。现在该项目已经有所增长,我通过在模拟过程中不会改变的参数添加了额外的功能。随之而来的是让程序根据它们的值做一件事或另一件事的必要性,即相当多的 if-else 分散在代码中。

我的问题很简单:Python 是否实现了某种形式的分支预测?我会显着降低性能还是解释器足够聪明以看到某些参数永远不会改变?在一个被调用一百万次的函数内有一个常量 if-else,是每次都会评估条件还是发生一些魔法?当没有简单的方法可以完全删除条件时,有没有办法给解释器一些提示并支持/模拟分支预测?

Lee*_*eor 4

理论上,您可以从一些 JIT 功能中受益,这些功能可以随着时间的推移观察控制流,并可以通过重新排列代码来有效地抑制从未采用的分支。一些 Python 解释器包含 JIT 编译器(我认为 PyPy 在较新的版本中也有,也许 Jython 也有),并且可能能够进行这种优化,但这当然取决于实际的代码。

然而,分支预测的主要形式是在硬件中完成的,与所使用的软件或语言结构无关(在Python的情况下 - 上面有很多抽象级别)。该机制最终将这些条件代码路径观察为分支,并且如果它们确实是静态确定的,则可能能够学习它们。然而,与任何预测机制一样,它的容量有限,并且由于您的代码应该很大,因此它可能无法容纳所有这些分支的预测。它仍然被认为相当好,所以关键的部分可能会起作用。

最后,如果您确实想优化代码,可以将其中一些条件转换为常量(为参数分配常量值而不是解析命令行),或者使用__debug__. 这样您就不必担心预测它们,但如果您将来需要它们,可以用最少的工作恢复功能。