【问题标题】:Has Python got branch prediction?Python有分支预测吗?
【发布时间】:2019-03-31 00:23:00
【问题描述】:

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

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

【问题讨论】:

  • "或者解释器是否足够聪明,可以看到某些参数永远不会改变?"不,每次都会检查。
  • 我怀疑 python 解释器是否会从分支预测中受益匪浅。
  • 如果这些参数永远不会改变,也许您可​​以在全局级别对其进行一次评估并将结果作为bool 传递给函数?
  • 您可以将numba 用于您的功能吗?没有更多细节,很难确定。

标签: python branch-prediction


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-25
    • 2014-03-03
    • 2014-02-21
    • 2016-07-01
    • 2011-02-01
    • 2015-11-24
    • 2012-07-02
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多