猿问

如何逐行描述Python代码?

我一直在使用cProfile来分析我的代码,并且效果很好。我还使用gprof2dot.py可视化结果(使其更加清晰)。


但是,cProfile(以及到目前为止我见过的大多数其他Python分析器)似乎仅在函数调用级别进行分析。当从不同位置调用某些函数时,这会引起混乱-我不知道调用#1或调用#2是否占用了大部分时间。当所讨论的函数有六个层次的深度(从其他七个地方调用)时,情况甚至更糟。


如何获得逐行分析?


代替这个:


function #12, total time: 2.0s

我想看这样的东西:


function #12 (called from somefile.py:102) 0.5s

function #12 (called from main.py:12) 1.5s

cProfile确实显示了“转移”到父级的总时间,但是当您有许多层和相互连接的呼叫时,该连接也会丢失。


理想情况下,我希望拥有一个可以解析数据的GUI,然后向我显示源文件以及每行的总时间。像这样:


main.py:


a = 1 # 0.0s

result = func(a) # 0.4s

c = 1000 # 0.0s

result = func(c) # 5.0s

然后,我可以单击第二个“ func(c)”调用,以查看该调用中所占用的时间,与“ func(a)”调用分开。


那有意义吗?是否有任何收集此类信息的性能分析库?我错过了一些很棒的工具吗?



PIPIONE
浏览 306回答 3
3回答

人到中年有点甜

我相信这就是Robert Kern的line_profiler的目的。从链接:File: pystone.pyFunction: Proc2 at line 149Total time: 0.606656 sLine #      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希望有帮助!
随时随地看视频慕课网APP

相关分类

Python
我要回答