2016-03-29 3 views
3

私はキャッシングシステムに取り組んでいます。この考え方は、キャッシュオブジェクトを作成した関数が最初の作成から変更されたかどうかを検出できるため、キャッシュファイルを無効にすることができます。複数のプログラム実行の間にfunction .__ code__の動作とは何ですか?

私はPythonのfunction.__code__属性、つまりコンパイルされた関数のバイトコード表現を見つけました。私はこの問題に関する多くの追加の文書を見つけることができず、単一のプログラムの異なる実行間でその動作が何であるか疑問に思っていました。

私は、Pythonはインタプリタ言語であるため、バイトコードはプラットフォームに依存しないと仮定します。私はまた、そのバイトコードの生成が特定の入力に対して決定論的であると仮定します。私はそう思うのですか?

+1

私はそれがインタプリタのバージョンによって変わるかもしれないと思う – wRAR

答えて

2

関数.__ code__属性は、仮想マシンのバイトコードをカプセル化するオブジェクトを返します。

def f(): return 3 
print(dir(f.__code__)) 
print(f.__code__.co_code) # raw compiled bytecode 

情報にアクセスする別の方法は、明示的にファイルをコンパイルすることです。

def f(): return 3 

その後、あなたはPythonのプロンプトに入力することができます:

>>> c = compile('test.py', 'test.py', 'exec') 
>>> print(c.co_code) # here is some bytecode 

バイトコードにアクセスするためのシンプルで面白い方法を、非常に読みやすい方法で、実行することです。ここ はファイルtest.pyです

python -m dis test.py 

出力:

0それは、端末に(ここでは、 disは逆アセンブラです)
1   0 LOAD_CONST    0 (<code object f at 0x7fe8a5902300, file "p.py", line 1>) 
      3 LOAD_CONST    1 ('f') 
      6 MAKE_FUNCTION   0 
      9 STORE_NAME    0 (f) 
     12 LOAD_CONST    2 (None) 
     15 RETURN_VALUE 

このバイトコードはプラットフォームに依存しません。 VMはです。バイトコードでの最終的な変化について


、私はthis fileを取り、それを2回分解しています:変更は主に輸入に関してれ

89c89 
< 26   204 LOAD_CONST    13 (<code object search_concept at 0x7f40de337300, file "powergrasp/compression.py", line 26>) 
--- 
> 26   204 LOAD_CONST    13 (<code object search_concept at 0x7fd8de5ab300, file "powergrasp/compression.py", line 26>) 
104c104 
<    240 LOAD_CONST    19 (<code object compress_lp_graph at 0x7f40de340780, file "powergrasp/compression.py", line 55>) 
--- 
>    240 LOAD_CONST    19 (<code object compress_lp_graph at 0x7fd8de5b4780, file "powergrasp/compression.py", line 55>) 

python3 -m dis file.py > test1 
python3 -m dis file.py > test2 

次に簡単なdiffがあることを示しここで、ロードされたモジュールのアドレスはコンパイル全体で同じではありません。

関連する問題