为了账号安全,请及时绑定邮箱和手机立即绑定

如何逐行描述Python代码?

如何逐行描述Python代码?

PIPIONE 2019-12-11 17:46:55
我一直在使用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.5scProfile确实显示了“转移”到父级的总时间,但是当您有许多层和相互连接的呼叫时,该连接也会丢失。理想情况下,我希望拥有一个可以解析数据的GUI,然后向我显示源文件以及每行的总时间。像这样:main.py:a = 1 # 0.0sresult = func(a) # 0.4sc = 1000 # 0.0sresult = func(c) # 5.0s然后,我可以单击第二个“ func(c)”调用,以查看该调用中所占用的时间,与“ func(a)”调用分开。那有意义吗?是否有任何收集此类信息的性能分析库?我错过了一些很棒的工具吗?
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

我相信这就是Robert Kern的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

希望有帮助!



查看完整回答
反对 回复 2019-12-11
  • 3 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信