我一直在使用cProfile来分析我的代码,它一直很好用。我还使用gprof2dot.py来显示结果(使其更清晰)。
但是,cProfile(以及到目前为止我见过的大多数其他Python分析器)似乎只在函数调用级别进行分析。当从不同的地方调用某些函数时,这会引起混淆 - 我不知道呼叫#1或呼叫#2是否占用了大部分时间。当所讨论的函数深度为六级时,这会变得更糟,从其他七个地方调用。
如何进行逐行分析?
而不是这个:
function#12, total time: 2.0s
我想看到这样的事情:
function#12 (called from somefile.py:102) 0.5sfunction#12 (called from main.py:12) 1.5s
cProfile确实显示了总共有多少时间“转移”到父级,但是当你有一堆层和互连的调用时,这种连接又会丢失。
理想情况下,我希望有一个GUI来解析数据,然后向我显示我的源文件,每个行的总时间。像这样的东西:
main.py:a=1# 0.0sresult=func(a)# 0.4sc=1000# 0.0sresult=func(c)# 5.0s
然后我就可以点击第二个“func(c)”调用来查看该调用中占用的时间,与“func(a)”调用分开。
那有意义吗?是否有任何分析库收集此类信息?我错过了一些很棒的工具吗?
解决方案
File: pystone.py
Function: Proc2 at line 149
Total time: 0.606656 s
Line # Hits Time Per Hit % Time Line Contents
==============================================================
149 @profile
150 def Proc2(IntParIO):
151 50000 82003 1.6 13.5 IntLoc = IntParIO + 10
152 50000 63162 1.3 10.4 while 1:
153 50000 69065 1.4 11.4 if Char1Glob == 'A':
154 50000 66354 1.3 10.9 IntLoc = IntLoc - 1
155 50000 67263 1.3 11.1 IntParIO = IntLoc - IntGlob
156 50000 65494 1.3 10.8 EnumLoc = Ident1
157 50000 68001 1.4 11.2 if EnumLoc == Ident1:
158 50000 63739 1.3 10.5 break
159 50000 61575 1.2 10.1 return IntParIO
希望有所帮助!