【问题标题】:Why is integer divisions not optimised when compiling to bytecode?为什么编译为字节码时整数除法没有优化?
【发布时间】:2014-05-26 17:05:46
【问题描述】:

首先,让我展示一个我做的实验:

In [69]: dis.dis(lambda : 4 / 2 +  1.5 * 2 + (4 - 2))
  1           0 LOAD_CONST               1 (4)
              3 LOAD_CONST               2 (2)
              6 BINARY_DIVIDE       
              7 LOAD_CONST               4 (3.0)
             10 BINARY_ADD          
             11 LOAD_CONST               5 (2)
             14 BINARY_ADD          
             15 RETURN_VALUE 

正如您在 dis.dis 的输出中看到的那样,1.5 * 24 - 2 被编译为 LOAD_CONST 而不是两个 LOAD_CONST 后跟二进制操作。

4 / 2 不会被替换为LOAD_CONST 4 (2)

我想知道为什么优化中忽略了除法。

我使用的 Python 版本是 2.7.5。

顺便说一句,似乎在 Python 3 中,像这样的函数得到了更好的优化,这就是我所看到的:

>>> dis.dis(lambda : 4 / 2 +  1.5 * 2 + (4 - 2))
  1           0 LOAD_CONST               8 (7.0)
              3 RETURN_VALUE

【问题讨论】:

    标签: python bytecode python-internals


    【解决方案1】:

    因为分割可以受以下因素控制

    1. python -Q命令行参数

    2. from __future__ import division

    在编译时对窥孔优化器不可用。

    这在peephole的源码中有解释

    【讨论】:

    • 嘿嘿,这个问题在聊天室里讨论过不久就被问到了! :-)
    • @MartijnPieters 是的。另外,我两天前answered a similar question :-)
    • 啊!这就是你提出来的原因! :-)
    • 是的,我知道它优化了乘法(从字节码中可以明显看出),但我无法解释为什么没有除法。这就是我问你的原因,同时浏览了窥视孔代码并弄清楚发生了什么:-)
    • @thefourtheye 关于这个peephole 的东西有什么好的资源?
    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2017-07-25
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多