我在Python中实现了物理模拟(无论如何,大部分繁重的工作都是在数字库中完成的,因此性能已经足够好了(。 现在项目已经有所增长,我通过模拟期间不会更改的参数添加了额外的功能。随之而来的是让程序根据它们的值做一件事或另一件事的必要性,即,相当多的if-else分散在代码周围。
我的问题很简单:Python是否实现了某种形式的分支预测?我是否会显著佩戴性能,或者口译员是否足够聪明,可以看到某些参数永远不会改变?在一个被调用一百万次的函数中有一个常量的if-else,是每次都评估条件还是发生了一些魔术?当没有简单的方法完全删除条件时,有没有办法给解释器一些提示并支持/模拟分支预测?
理论上,您可以从一些 JIT 功能中受益,这些功能可能会随着时间的推移观察控制流,并且可以通过重新排列代码来有效地抑制从未采用的分支。一些 Python 解释器包含 JIT 编译器(我认为 PyPy 在较新版本中也是如此,也许 Jython 也是如此(,并且可能能够进行此优化,但这当然取决于实际代码。
然而,分支预测的主要形式是在硬件中完成的,与所使用的软件或语言结构无关(在 Python 的情况下 - 上面有相当多的抽象级别(。这种机制最终将这些条件代码路径观察为分支,如果它们确实是静态确定的,则可能能够学习它们。但是,与任何预测机制一样,它的容量有限,并且由于您的代码应该很大,因此它可能无法容纳所有这些分支的预测。它仍然被认为是相当不错的,所以关键的东西可能会起作用。
最后,如果你真的想优化你的代码,你可以将其中一些条件转换为常量(为参数分配一个常量值而不是解析命令行(,或者用类似__debug__
的东西完全隐藏条件。这样,您就不必担心预测它们,但如果您将来需要它们,可以用最少的工作恢复功能。