dis模块可以有效地用于将Python方法,函数和类分解为低级解释器指令.
我知道该dis信息可用于:
1.在使用线程的程序中查找竞争条件
2.找到可能的优化
根据您的经验,您是否知道反汇编Python功能可能有用的任何其他场景?
dis 很有用,例如,当你有不同的代码做同样的事情,你想知道性能差异在哪里.
list += [item]vslist.append(item)def f(x): return 2*x
def f1(func, nums):
result = []
for item in nums:
result += [fun(item)]
return result
def f2(func, nums):
result = []
for item in nums:
result.append(fun(item))
return result
Run Code Online (Sandbox Code Playgroud)
timeit.timeit说这f2(f, range(100))大约快两倍f1(f, range(100).为什么?
(有趣的f2是,速度大致相同map(f, range(100)).)
你可以通过调用看到dis的整个输出dis.dis(f1),这里是第4行.
4 19 LOAD_FAST 2 (result)
22 LOAD_FAST 1 (fun)
25 LOAD_FAST 3 (item)
28 CALL_FUNCTION 1
31 BUILD_LIST 1
34 INPLACE_ADD
35 STORE_FAST 2 (result)
38 JUMP_ABSOLUTE 13
>> 41 POP_BLOCK
Run Code Online (Sandbox Code Playgroud)
同样,这里只有第4行:
4 19 LOAD_FAST 2 (result)
22 LOAD_ATTR 0 (append)
25 LOAD_FAST 1 (fun)
28 LOAD_FAST 3 (item)
31 CALL_FUNCTION 1
34 CALL_FUNCTION 1
37 POP_TOP
38 JUMP_ABSOLUTE 13
>> 41 POP_BLOCK
Run Code Online (Sandbox Code Playgroud)
在f1我们需要:
fun上item(操作码28)result(操作码34)result(操作码35)中在f2相反,我们只是:
fun上item(操作码31)append上result(操作码34; C代码:快!)这解释了为什么(imho)更具表现力list += [value]的list.append()方法比方法慢得多.
除此之外,dis.dis主要用于好奇心和尝试从.pyc文件重构代码,你没有花费一大笔钱来源:)
我认为该dis模块本质上是一种学习工具.了解哪些操作码的Python代码一定片段生成是一个开始越来越"深入"到你的Python的把握-生根其语义的"抽象"理解成(多一点)具体实施的一个样本.有时确切的原因有一定的Python代码片段的行为它可能是很难把握的"自上而下"与纯粹的推理是从Python的语义"规则"的方式:在这种情况下,加强研究与一些"自下而上"验证(基于可能的实施,当然 - 其他实施也是可能的;-)真的可以帮助研究的有效性.