一.代码调试
1.print()函数调试
2.用pdb进行代码调试
pdb是Python自带的代码调试库,直接输入 import pdb 即可导入。使用pdb.set_trace()方法即可对代码进行调试:
import pdb
a = 1
b = 2
def func():
print('enter func()')
pdb.set_trace()
c = 3
func()
print(a + b + c)
当运行后,首先出现:
键入n(next)执行下一步代码:
键入l,查看上下文代码信息:
键入q(quit)退出调试:
更多用法请参看Python官方文档pdb
二.性能分析
日常工作中,我们常常会遇到这样的问题:在线上,发现产品的某个功能模块效率低下,延迟高,占用的资源多,但却不知道是哪里出了问题。
这时,对代码进行 profile 就显得异常重要了。
这里所谓的 profile,是指对代码的每个部分进行动态的分析,比如准确计算出每个模块消耗的时间等。
计算斐波拉契数列,运用递归思想(用cProfile进行性能分析):
import cProfile
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
def fib_seq(n):
res = []
if n > 0:
res.extend(fib_seq(n-1))
res.append(fib(n))
return res
fib_seq(30)
cProfile.run('fib_seq(30)')
结果如下:
ncalls,是指相应代码 / 函数被调用的次数
tottime,是指对应代码 / 函数总共执行所需要的时间(注意,并不包括它调用的其他代码 / 函数的执行时间)
tottime percall,就是上述两者相除的结果,也就是tottime / ncalls
cumtime,则是指对应代码 / 函数总共执行所需要的时间,这里包括了它调用的其他代码 / 函数的执行时间
cumtime percall,则是 cumtime 和 ncalls 相除的平均结果。