私はいつもPythonインタープリターが-O
フラグなしで最適化を行わないと思っていましたが、以下は少し奇妙です:
>>> def foo():
... print '%s' % 'Hello world'
...
>>> from dis import dis
>>> dis(foo)
2 0 LOAD_CONST 3 ('Hello world')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
インタプリタが2つの文字列定数のモジュロでフォールディングを行っているように見えます。ただし、変数を追加すると、最適化されていない結果が得られます。
>>> def foo():
... s = 'Hello world!'
... print '%s' % s
...
>>> dis(foo)
2 0 LOAD_CONST 1 ('Hello world!')
3 STORE_FAST 0 (s)
3 6 LOAD_CONST 2 ('%s')
9 LOAD_FAST 0 (s)
12 BINARY_MODULO
13 PRINT_ITEM
14 PRINT_NEWLINE
15 LOAD_CONST 0 (None)
18 RETURN_VALUE
Pythonは-Oフラグなしでどのような最適化を行いますか?そして、それらを無効にする方法はありますか?最適化されていないPythonバイトコードがどのように表示されるかを確認したいと思います。実稼働タイプの環境でこれを行う予定はありません。