Python インタープリター (CPython、Jython など) が与えられた場合、生成されたバイトコードは確定的ですか? つまり、空白のみが異なり、それ以外は構文的に同等である 2 つの異なるスクリプトをコンパイルすると、選択したコンパイラはまったく同じバイトコードを生成するでしょうか?
1 に答える
6
何を探しているのか正確にはわかりません。構文的には、同じコードは同じ命令が実行されることになります。しかし、構文的に同等の python ファイルでも、異なる.pyc
キャッシュされたバイトコード ファイルを生成できます。改行を追加または削除すると、異なる行オフセットになります。
>>> import dis
>>> def foo():
... # in the interpreter, comments will do the same job as newlines
... baz
... # extra newlines or comments push the bytecode offsets
... return 42
...
>>> def bar():
... baz
... return 42
...
>>> dis.dis(foo)
3 0 LOAD_GLOBAL 0 (baz)
3 POP_TOP
5 4 LOAD_CONST 1 (42)
7 RETURN_VALUE
>>> dis.dis(bar)
2 0 LOAD_GLOBAL 0 (baz)
3 POP_TOP
3 4 LOAD_CONST 1 (42)
7 RETURN_VALUE
左側の列の異なる値に注意してください。インタプリタはまったく同じように動作しますが、オフセットが異なります。
バイトコードとオフセットは、インタプリタが実行するものを等しくしたまま、別々にアクセスできます。
>>> foo.__code__.co_lnotab
'\x00\x02\x04\x02'
>>> bar.__code__.co_lnotab
'\x00\x01\x04\x01'
>>> foo.__code__.co_code == bar.__code__.co_code
True
于 2013-10-16T21:02:51.810 に答える