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

标签 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 来比较两者?

提前致谢。

最佳答案

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

尝试 IPython 中的 %%timeit 魔法函数。

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

我最近找到了this blog post教授如何在 Python 中测量这些类型的东西。不仅是时间,还有内存使用。该帖子的亮点(至少对我而言)是它教您实现 %lprun 魔法函数。

使用它,您将能够逐行查看您的函数,并准确了解每个函数占总花费时间的比例。

我已经使用了几个星期了,非常好。

关于python - 如何使用 `dis.dis` 来分析性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322705/

相关文章:

CSS - 重用同一张图片是否像两个单独的图片一样执行

mysql - 在 MySQL 中使用带有主键的 SELECT

java - 树库式树解析器 python

python - 可以在内联注释中指定哪些 pylint 选项?

python - 单击时如何获取形状的标签

c++ - 比较 vector 中的元素时花费的时间呈指数增长

python - 计算列表从0到n-1的元素之和并与最大的比较

python - Buildbot 强制通过 python 构建

python - 使用 random 函数随机化计划任务

Python:如何在输出中输出正确的染色体名称?