Python 如何使用dis.dis来分析性能?
我正在尝试使用python的库来试验和理解性能。下面是我尝试过的一个实验,结果如下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)
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