代码调试和性能分析

代码调试

最简单的调试方法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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值