6

我正在尝试使用 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    

现在,我明白了……

  • 最左边的 & 是行45
  • 中间的列是机器调用的操作码
  • 右边的列是对象(带有opargs?)

...但这一切在性能方面意味着什么?如果我试图决定使用哪个功能,我将如何dis比较两者?

提前致谢。

4

1 回答 1

4

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

尝试来自 IPython 的 %%timeit 魔术函数。

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

我最近发现了这篇博客文章,它教你如何在 Python 中测量这些东西。不仅是时间,还有内存使用。这篇文章的亮点(至少对我来说)是它教你实现 %lprun 魔法功能的时候。

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

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

于 2013-10-11T17:35:10.813 回答