我如何配置python代码逐行?

我一直在使用cProfile来配置我的代码,它一直工作很好。我也使用gprof2dot.py来可视化的结果(使它有点清晰)。

然而,cProfile(和迄今为止我看到的大多数其他python剖析器)似乎只在函数调用级别。当从不同地方调用某些函数时,这会导致混乱 – 我不知道调用#1或调用#2是否占用大部分时间。当所讨论的函数是6级深,从其他7个地方调用时,这变得更糟。

所以我的问题是:我如何获得逐行分析?而不是这样:

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)”调用分开。

那有意义吗?有没有收集这种类型的信息的任何剖析库?有没有一些真棒工具,我错过了?任何反馈赞赏。谢谢!!

我相信这是Robert Kern’s line_profiler的目的。从链接:

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

希望有所帮助!

http://stackoverflow.com/questions/3927628/how-can-i-profile-python-code-line-by-line

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:我如何配置python代码逐行?