python - Python有分支预测吗?
问题描述
我在 Python 中实现了一个物理模拟(无论如何,大部分繁重的工作都是在数值库中完成的,因此性能足够好)。现在项目已经发展了一些,我通过在模拟过程中不会改变的参数添加了额外的功能。随之而来的是让程序根据它们的值做一件事或另一件事的必要性,即,相当多的 if-else 散布在代码周围。
我的问题很简单:Python 是否实现了某种形式的分支预测?我会显着降低性能还是解释器足够聪明,可以看到某些参数永远不会改变?在一个被调用一百万次的函数中拥有一个常量 if-else,是每次都评估条件还是发生一些魔术?当没有简单的方法完全删除条件时,有没有办法给解释器一些提示并支持/模拟分支预测?
解决方案
理论上,您可以从一些 JIT 功能中受益,这些功能可以随着时间的推移观察控制流,并且可以通过重新排列代码有效地抑制从未采用的分支。一些 Python 解释器包含 JIT 编译器(我认为 PyPy 在较新的版本中也有,也许 Jython 也是如此),并且可能能够进行这种优化,但这当然取决于实际代码。
然而,分支预测的主要形式是在硬件中完成的,并且与使用的软件或语言结构无关(在 Python 的情况下 - 上面有很多抽象级别)。这种机制最终将这些条件代码路径视为分支,并且如果它们确实是静态确定的,则可能能够学习它们。但是,作为任何预测机制,它的容量有限,并且由于您的代码应该很大,它可能无法容纳所有这些分支的预测。它仍然被认为非常好,所以关键的可能会起作用。
最后,如果您真的想优化您的代码,您可以将其中一些条件转换为常量(为参数分配一个常量值而不是解析命令行),或者使用类似__debug__
. 这样您就不必担心预测它们,但如果您将来需要它们,可以用最少的工作恢复功能。
推荐阅读
- twitter-bootstrap - Bootstrap 中纠结的卡片
- spring-data-redis - spring-boot-starter-data-redis 是如何工作的?
- google-apps-script - 如何根据“Google表格”中单元格内的字体颜色提取文本,其中包含多种颜色的文本
- html - 输入属性 type="number" 在 IE11 中不起作用。我怎样才能解决这个问题?
- android - 通过从 Flutter 中的 firebase 实时数据库中获取布尔值来更新按钮的状态
- jquery - jquery-migrate.js:43 Uncaught TypeError: jQuery.migrateWarnings.push not a function 问题
- javascript - 将光标悬停在图像上后 - 箭头必须出现在左侧和右侧
- javascript - 自定义图像库上的图像闪烁
- javascript - 如何在我的对象标签的内屏幕上获得与输入网站控制台命令相同的效果?
- javascript - Quasar:当我单击其中一个菜单时,drawerClick 不起作用