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

时间:2013-10-11 16:14:50

标签: python performance python-2.7

我正在尝试使用python的dis库来试验&了解表现。以下是我尝试过的实验,结果如下。

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)

  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 

>>> dis.dis(myfunc2所)

  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    

现在,我理解......

  • 4&最左边的5是行号
  • 中间的列是机器调用的操作码
  • 右侧的列是对象(opargs?)

......但这对性能而言意味着什么呢?如果我试图决定使用哪个函数,我将如何使用dis来比较这两个函数?

提前致谢。

1 个答案:

答案 0 :(得分:4)

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

从IPython尝试%% timeit magic功能。

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

我最近发现this blog post教授如何在Python中测量这些东西。不仅是时间,还有内存使用。这个帖子的高光(至少对我来说)就是它教你实现%lprun魔术功能。

使用它,您将能够逐行查看您的功能,并准确了解每个功能对总花费的时间的贡献。

我已经使用了几个星期了,而且很棒。