Python3.0からされるようになった最適化

>>> def foo():
... 	return 2 ** 10
... 
>>> dis.dis(foo)
  2           0 LOAD_CONST               3 (1024) 
              3 RETURN_VALUE         

リテラル同士の計算はバイトコンパイル時に計算して結果をバイトコードに書き込む。

残念ながら定数であることが明らかであっても変数を含む式は計算しない。

>>> def foo():
... 	N = 10
... 	return 2 ** N
... 
>>> dis.dis(foo)
  2           0 LOAD_CONST               1 (10) 
              3 STORE_FAST               0 (N) 

  3           6 LOAD_CONST               2 (2) 
              9 LOAD_FAST                0 (N) 
             12 BINARY_POWER         
             13 RETURN_VALUE         



2 ** 10は2.5でも最適化されてたので例を変更。

# 2.6
>>> def foo(): return 1.0 / 2.0
... 
>>> dis.dis(foo)
  1           0 LOAD_CONST               1 (1.0)
              3 LOAD_CONST               2 (2.0)
              6 BINARY_DIVIDE       
              7 RETURN_VALUE        

# 3.0
>>> def foo(): return 1.0 / 2.0
... 
>>> dis.dis(foo)
  1           0 LOAD_CONST               3 (0.5) 
              3 RETURN_VALUE