4

まず、私が行った実験を示しましょう。

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_CONSTLOAD_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
4

1 に答える 1

7

分割は次の要因によって制御できるため、

  1. python -Qコマンドライン引数

  2. from __future__ import division

これは、コンパイル時にピープホール オプティマイザで使用できません。

これは、のぞき穴のソースコードで説明されています

于 2014-04-12T13:56:54.047 に答える