1

我刚刚在python中遇到了反汇编函数。但我无法弄清楚这意味着什么。任何人都可以根据阶乘函数的结果(基于递归和循环)解释工作和使用

递归代码和对应的dis代码:

>>> def fact(n):
...     if n==1:
...             return 1
...     return n*fact(n-1)
... 
>>> dis.dis(fact)
2           0 LOAD_FAST                0 (n)
          3 LOAD_CONST               1 (1)
          6 COMPARE_OP               2 (==)
          9 POP_JUMP_IF_FALSE       16
3          12 LOAD_CONST               1 (1)
         15 RETURN_VALUE        
4     >>   16 LOAD_FAST                0 (n)
         19 LOAD_GLOBAL              0 (fact)
         22 LOAD_FAST                0 (n)
         25 LOAD_CONST               1 (1)
         28 BINARY_SUBTRACT     
         29 CALL_FUNCTION            1
         32 BINARY_MULTIPLY     
         33 RETURN_VALUE        

使用循环的阶乘函数给出以下结果:

def factor(n):
...     f=1
...     while n>1:
...             f*=n
...             n-=1
... 
>>> dis.dis(factor)
2           0 LOAD_CONST               1 (1)
          3 STORE_FAST               1 (f)

3           6 SETUP_LOOP              36 (to 45)
    >>    9 LOAD_FAST                0 (n)
         12 LOAD_CONST               1 (1)
         15 COMPARE_OP               4 (>)
         18 POP_JUMP_IF_FALSE       44

4          21 LOAD_FAST                1 (f)
         24 LOAD_FAST                0 (n)
         27 INPLACE_MULTIPLY    
         28 STORE_FAST               1 (f)

5          31 LOAD_FAST                0 (n)
         34 LOAD_CONST               1 (1)
         37 INPLACE_SUBTRACT    
         38 STORE_FAST               0 (n)
         41 JUMP_ABSOLUTE            9
    >>   44 POP_BLOCK           
    >>   45 LOAD_CONST               0 (None)
         48 RETURN_VALUE        

谁能告诉我如何确定哪个更快?

4

3 回答 3

6

仅仅通过查看字节码是不可能确定哪个更快的;每个虚拟机都有与每个操作码相关的不同成本,因此运行时可能会有很大差异。

于 2013-06-12T04:07:59.037 回答
6

要测量某物的运行速度,请使用timeitPython 附带的模块。

dis模块用于了解字节码的外观;它非常特定于cpython。

它的一种用途是查看为循环或方法中的变量分配什么、何时以及如何存储。但是,这是一个专门的模块,通常不用于效率计算;用于timeit弄清楚某事的速度有多快,然后dis了解幕后发生的事情 - 得出一个可能的原因

于 2013-06-12T04:10:44.867 回答
0

dis.dis()函数将函数反汇编为其字节码解释。

定时

正如 Ignacio 所说,由于 python 解释器实际运行操作码的方式不同,字节码的纯长度并不能准确地表示运行时间,而timeit模块将是您想要在那里使用的。

实际目的

此功能有多种用途,但它们不是大多数人最终会做的事情。作为优化或调试速度问题过程的一部分,您可以查看输出以提供帮助。在直接使用 python 解释器或编写自己的解释器时,它也可能被证明是有用的。您可以在此处查看文档以查看操作码的完整列表(不过,正如该页面所述,它很可能在 python 版本之间发生变化)。

总的来说,这并不是你在生产应用程序中真正使用的东西(除非你的应用程序是一个 python 反汇编程序!)但是当你真的非常需要优化你的代码并在最低级别进行调试时,这就是函数将派上用场。

于 2013-06-12T04:23:14.857 回答