在哪种情况下,在python上使用Disassembly很有用?

sys*_*out 3 python assembly

dis模块可以有效地用于将Python方法,函数和类分解为低级解释器指令.

我知道该dis信息可用于:
1.在使用线程的程序中查找竞争条件
2.找到可能的优化

根据您的经验,您是否知道反汇编Python功能可能有用的任何其他场景?

bad*_*adp 7

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)).)

F1

你可以通过调用看到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)

F2

同样,这里只有第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我们需要:

  • 调用funitem(操作码28)
  • 列出一个清单(操作码31,价格昂贵!)
  • 添加到result(操作码34)
  • 将返回的值存储在result(操作码35)中

f2相反,我们只是:

  • 调用funitem(操作码31)
  • 调用appendresult(操作码34; C代码:快!)

这解释了为什么(imho)更具表现力list += [value]list.append()方法比方法慢得多.


除此之外,dis.dis主要用于好奇心和尝试从.pyc文件重构代码,你没有花费一大笔钱来源:)


Ale*_*lli 5

我认为该dis模块本质上是一种学习工具.了解哪些操作码的Python代码一定片段生成是一个开始越来越"深入"到你的Python的把握-生根其语义的"抽象"理解成(多一点)具体实施的一个样本.有时确切的原因有一定的Python代码片段的行为它可能是很难把握的"自上而下"与纯粹的推理是从Python的语义"规则"的方式:在这种情况下,加强研究与一些"自下而上"验证(基于可能的实施,当然 - 其他实施也是可能的;-)真的可以帮助研究的有效性.