最佳答案
我想了解如何使用 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等是字节码指令 (虽然有趣的是,BUILD_SET没有出现在这个列表中,但是我希望它的工作原理是:。我认为右边的数字是内存分配,左边的数字是 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