0

Python インタープリター (CPython、Jython など) が与えられた場合、生成されたバイトコードは確定的ですか? つまり、空白のみが異なり、それ以外は構文的に同等である 2 つの異なるスクリプトをコンパイルすると、選択したコンパイラはまったく同じバイトコードを生成するでしょうか?

4

1 に答える 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 に答える