まず、私が行った実験を示しましょう。
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
の出力でわかるように、2 つに続いて 2 項演算ではなく に1.5 * 2
コンパイル4 - 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