dis (Python バイトコードのディスセンブラー) の使用方法を理解したいと思います。dis.dis
具体的には、 (または)の出力をどのように解釈する必要がありdis.disassemble
ますか?
.
これは非常に具体的な例です (Python 2.7.3):
dis.dis("heapq.nsmallest(d,3)")
0 BUILD_SET 24933
3 JUMP_IF_TRUE_OR_POP 11889
6 JUMP_FORWARD 28019 (to 28028)
9 STORE_GLOBAL 27756 (27756)
12 LOAD_NAME 29811 (29811)
15 STORE_SLICE+0
16 LOAD_CONST 13100 (13100)
19 STORE_SLICE+1
JUMP_IF_TRUE_OR_POP
etc がバイトコード命令であることがわかります(ただし、興味深いことに、BUILD_SET
このリストには表示されませんが、として機能すると予想されますBUILD_TUPLE
)。右側の数字はメモリ割り当てで、左側の数字はgotoの数字だと思います...毎回ほぼ3 ずつ増加していることに気付きました (完全ではありません)。
関数内にラップするとdis.dis("heapq.nsmallest(d,3)")
:
def f_heapq_nsmallest(d,n):
return heapq.nsmallest(d,n)
dis.dis("f_heapq(d,3)")
0 BUILD_TUPLE 26719
3 LOAD_NAME 28769 (28769)
6 JUMP_ABSOLUTE 25640
9 <44> # what is <44> ?
10 DELETE_SLICE+1
11 STORE_SLICE+1