python逐行判断_我如何逐行分析Python代码?

这篇博客探讨了如何进行Python代码的逐行分析,因为作者发现cProfile等传统分析工具在多层函数调用时无法清晰地展示每个调用的耗时。作者期望能看到每个函数在不同调用位置的具体耗时,并且希望有一个GUI工具能够展示源代码并突出每行的执行时间。文章提供了一个解决方案,展示了pystone.py文件中Proc2函数的详细分析结果,以说明理想的逐行分析应该呈现的信息。
摘要由CSDN通过智能技术生成

我一直在使用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

希望有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值