translation.backendopt.merge_if_blocks

  • 名称: merge_if_blocks
  • 描述: 合并 if … elif 链
  • 命令行: –if-block-merge
  • 命令行否定: –no-if-block-merge
  • 选项类型: 布尔选项
  • 默认值: True

此优化将来自 if 和 elif 链的流程图部分转换为合并的块。

默认情况下,这种代码的流程图

if x == 0:
    f()
elif x == 1:
    g()
elif x == 4:
    h()
else:
    j()

将导致一个带有两个出口的块链,有点像这样

../_images/unmergedblocks.png

(反映了 Python 如何解释这段代码)。运行此优化将转换块结构,使其包含一个带有四个出口的单个“选择块”

../_images/mergedblocks.png

然后,这可以通过 C 后端转换为 switch,允许 C 编译器生成更有效的代码。