Python 如何使用dis.dis来分析性能?

Python 如何使用dis.dis来分析性能?,python,performance,python-2.7,Python,Performance,Python 2.7,我正在尝试使用python的库来试验和理解性能。下面是我尝试过的一个实验,结果如下 import dis def myfunc1(dictionary): t = tuple(dictionary.items()) return t def myfunc2(dictionary, func=tuple): t = func(dictionary.items()) return t >>>dis.dis(myfunc1) >>>dis.dis(myfunc2)

我正在尝试使用python的库来试验和理解性能。下面是我尝试过的一个实验,结果如下

import dis

def myfunc1(dictionary):
    t = tuple(dictionary.items())
    return t

def myfunc2(dictionary, func=tuple):
    t = func(dictionary.items())
    return t
>>>dis.dis(myfunc1) >>>dis.dis(myfunc2) 现在,我明白了

  • 最左边的
    4
    5
    是行号
  • 中间的列是由机器< /LI>调用的操作码。
  • 右侧的列是对象(带?)
…但这一切在性能方面意味着什么?如果我试图决定使用哪个函数,我将如何使用
dis
来比较两者

提前感谢。

您(或至少是普通人)无法查看不同的汇编代码,并判断哪一个更快

尝试IPython的%%timeit魔术功能

它会自动运行代码多次,并给你一个客观的答案

我最近发现它教会了如何在Python中度量这类事情。不仅是时间,还有内存使用。这篇文章的重点(至少对我来说)是它教你如何实现%lprun魔法函数

使用它,您将能够逐行查看您的功能,并确切地知道每个功能对总花费时间的贡献


我已经用了几个星期了,它很棒。

不要用
dis.dis
来做这个。使用
timeit
dis
对于比较不同代码样本之间的字节码差异非常有用,这可以让您了解一个编程构造是否编译成比另一个复杂得多的字节码。对于真正的性能问题,您应该进行配置,测量执行时间。一般来说,您不能。字节码的执行时间可能大不相同。例如,对C函数的调用是单个字节码,但可能需要几年才能执行,而在其他情况下,您有几十个字节码,但都需要几纳秒。要比较性能,请使用探查器。谢谢你们。我甚至不知道现在是否需要“答案”。:-)在这种特定的情况下,由于两种情况下调用的对象是相同的(因此,
CALL\u FUNCTION
时间无关紧要),我们可以说第二个函数执行得更快。字节码之间唯一的区别是
myfunc2
使用
LOAD\u FAST
,其中
1
使用
LOAD\u GLOBAL
,因为加载的对象是
2
中的函数参数。由于
LOAD\u FAST
非常快,因为它只加载函数对象的一个插槽,而
LOAD\u GLOBAL
使用相当复杂的查找,
2
将(稍微)快一些。这也可以通过使
func
成为局部变量而不是参数来实现。@l4mpi我认为你的分析就是OP想要的答案。目前唯一可用的答案是告诉OP不要使用
dis
进行性能分析,这对初学者来说是一个很好的一般性建议,但不是这个问题的好答案。您可能希望将您的评论作为答案重新发布。
  4           0 LOAD_GLOBAL              0 (tuple)
              3 LOAD_FAST                0 (dictionary)
              6 LOAD_ATTR                1 (items)
              9 CALL_FUNCTION            0
             12 CALL_FUNCTION            1
             15 STORE_FAST               1 (t)

  5          18 LOAD_FAST                1 (t)
             21 RETURN_VALUE 
  4           0 LOAD_FAST                1 (func)
              3 LOAD_FAST                0 (dictionary)
              6 LOAD_ATTR                0 (items)
              9 CALL_FUNCTION            0
             12 CALL_FUNCTION            1
             15 STORE_FAST               2 (t)

  5          18 LOAD_FAST                2 (t)
             21 RETURN_VALUE