代码调试
最简单的调试方法print,在小体量程序中,可以在调用函数前、函数中、函数后加一个打印,打印不出来的地方就是有问题的
def debugging():
a = list[1, 2, 3]
list.appand(2)
return a
print('1')
debugging()
print('2')
对于逻辑更复杂的代码,可以使用ide的debug工具,断点调试,但断点调试只中自上而下,不能回溯。python中有帮助进行调试的库(pbd, python debugger)
启动断点调试pdb.set_trace()
import pdb
a = 1
b = 2
pdb.set_trace()
c = 3
print(a+b+c)
此时在下方终端中就可以执行一些操作,打印-p,执行下一行-n,查看浮标前的代码-l,查看全部代码-ll,进入函数体内部-s,等。。。
(pdb) p a
1
(pdb) p b
2
更多功能参考官方文档:https://docs.python.org/3/library/pdb.html#module-pdb%EF%BC%89
性能分析
调用cProfile库,对代码的每个部分进行动态的分析,比如准确计算出每个模块消耗的时间等
例,计算斐波拉契数列(递归实现),这里只是为了举例子,斐波拉契在Python中a, b = b, a+b就可实现
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
cProfile.run('fib_seq(30)')
E:\python\Aanconda\python.exe "E:/python/code/Adavanced programming skills/text.py"
7049218 function calls (96 primitive calls) in 1.907 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.907 1.907 <string>:1(<module>)
7049123/31 1.907 0.000 1.907 0.062 text.py:11(fib)
31/1 0.000 0.000 1.907 1.907 text.py:20(fib_seq)
1 0.000 0.000 1.907 1.907 {built-in method builtins.exec}
31 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
30 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}
- ncalls,相应代码/函数被调用的次数
- tottime,对应代码/函数总共执行所需的时间(注意,并不包括它调用的其他代码 / 函数的执行时间)
- percall,上述两者相处的结果,tottime/ncalls
- cumtime,对应代码/函数总共执行所需要的时间(注意,包括了它调用的其他代码 / 函数的执行时间)
- percall,cumtime/ncalls