往常咱们测试程序,尤其是单个脚本及函数的性能,更多的是使用time.time() 来计算。 其实完全可以不要这样。 python语言有个Cprofile 库,是来分析所有过程的时间消耗的。
import timet = 0def a(): time.sleep(1)def b(): time.sleep(2)def c(): time.sleep(3)for i in range(100): t += ia()b()c()
下面可以很清晰的看到,各个步骤的及函数的消耗时间。
ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 6.006 6.006 <string>:1(<module>) 1 0.000 0.000 6.006 6.006 c.py:1(<module>) 1 0.000 0.000 1.000 1.000 c.py:3(a) 1 0.000 0.000 2.002 2.002 c.py:6(b) 1 0.000 0.000 3.003 3.003 c.py:9(c) 1 0.000 0.000 6.006 6.006 {execfile} 1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects} 1 0.000 0.000 0.000 0.000 {range} 3 6.005 2.002 6.005 2.002 {time.sleep}
还有一个是pdb,这个是用来一步步的调试程序用的,可以理解为IDE上面的逐步断点 。
python pdb调试python -m pdb myscript.py #注意这会重启myscript.py,这样启动的话,代码每一行都是一个节点也可以在程序中这么设置断点:import pdb; pdb.set_trace()支持的命令: p 打印变量 n next step 细点运行 c continue l list a args 打印当前函数的参数 condition bpnumber [condition] clear/disable/enable 清除/禁用/使能断点 q quit>断点设置 (Pdb)b 10 #断点设置在本py的第10行 或(Pdb)b ots.py:20 #断点设置到 ots.py第20行 删除断点(Pdb)b #查看断点编号 (Pdb)cl 2 #删除第2个断点>运行 (Pdb)n #单步运行 (Pdb)s #细点运行 也就是会下到,方法 (Pdb)c #跳到下个断点>查看 (Pdb)p param #查看当前 变量值 (Pdb)l #查看运行到某处代码 (Pdb)a #查看全部栈内变量
原文地址:使用pdb和profile更好友的调试python程序性能, 感谢原作者分享。 上帝助自助者。