首页 > 解决方案 > Python有分支预测吗?

问题描述

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

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

标签: pythonbranch-prediction

解决方案


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

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

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


推荐阅读