Python 核心技术与实战
景霄
Facebook 资深工程师
114324 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

31 | pdb & cProfile:调试和性能分析的法宝

继续执行程序
设置断点
退出当前函数
进入代码内部
列举当前代码行上下的源代码
继续执行代码
打印变量值
运行脚本命令中加入选项“-m cProfile”
运行cProfile.run()
导入cProfile模块
执行操作
启动pdb调试
Python的pdb
IDE断点调试
大型程序调试
小型程序调试
对pdb、cProfile或其他类似工具的使用经验
使用技巧
常用的调试和性能分析工具
cProfile的作用
pdb的作用
优化代码并重新进行profile
cProfile输出结果解读
cProfile的基本用法
性能分析的重要性
如何使用pdb
pdb的必要性
思考题
总结
用cProfile进行性能分析
用pdb进行代码调试
pdb & cProfile:调试和性能分析的法宝

该思维导图由 AI 生成,仅供参考

你好,我是景霄。
在实际生产环境中,对代码进行调试和性能分析,是一个永远都逃不开的话题。调试和性能分析的主要场景,通常有这么三个:
一是代码本身有问题,需要我们找到 root cause 并修复;
二是代码效率有问题,比如过度浪费资源,增加 latency,因此需要我们 debug;
三是在开发新的 feature 时,一般都需要测试。
在遇到这些场景时,究竟应该使用哪些工具,如何正确的使用这些工具,应该遵循什么样的步骤等等,就是这节课我们要讨论的话题。

用 pdb 进行代码调试

pdb 的必要性

首先,我们来看代码的调试。也许不少人会有疑问:代码调试?说白了不就是在程序中使用 print() 语句吗?
没错,在程序中相应的地方打印,的确是调试程序的一个常用手段,但这只适用于小型程序。因为你每次都得重新运行整个程序,或是一个完整的功能模块,才能看到打印出来的变量值。如果程序不大,每次运行都非常快,那么使用 print(),的确是很方便的。
但是,如果我们面对的是大型程序,运行一次的调试成本很高。特别是对于一些 tricky 的例子来说,它们通常需要反复运行调试、追溯上下文代码,才能找到错误根源。这种情况下,仅仅依赖打印的效率自然就很低了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Python中的pdb和cProfile是开发中不可或缺的调试和性能分析工具。pdb提供了交互式的源代码调试功能,通过设置断点和执行打印、单步执行、列举源代码等操作,提高了调试效率。而cProfile则可以对代码的每个部分进行动态分析,计算每个模块的消耗时间,帮助定位程序的瓶颈并进行优化。文章还介绍了cProfile的基本用法,并强调了pdb和cProfile对开发者的重要性。读者可以通过它们的官方文档进行实践,熟能生巧。整体而言,本文深入浅出地介绍了Python中常用的调试工具pdb和性能分析工具cProfile,为读者提供了宝贵的技术知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(30)

  • 最新
  • 精选
  • AllenGFLiu
    哥,不怀好意的问一下,你们在谷歌会用微软的vscode 吗?[奸笑脸] 每次看你都是提到pycharm ,我是从pycharm 转到vscode 上的,感觉整个世界都安静了。

    作者回复: 哈哈,我是fb的,不用vscode的哈

    2019-07-19
    5
    14
  • 小侠龙旋风
    我要把这个装饰器保存下来

    作者回复: 哈哈好

    2019-07-21
    3
    4
  • 321
    web 应用怎么调试?譬如flask或django框架开发的应用,该如何调试。

    作者回复: 看你侧重点是什么?如果是性能,有类似cProfile的工具,如果只是简单的debug,可以通过设置breakpoint或者print

    2019-07-19
    2
    2
  • xavier
    对应到C、C++就是gdb。现在被IDE给宠坏了,感觉还是Command Line纯粹。

    作者回复: 这个具体看需求和个人习惯了,ide方便就ide来,但是有些项目只能用command line

    2019-08-15
    1
  • return
    全文这个装饰器最牛逼。
    2019-07-19
    6
    81
  • ( ̄_ ̄ )
    和gdb的命令差不多
    2019-07-19
    10
  • frozen
    您好,pdb调试多线程的时候目前还不支持吧
    2019-07-25
    9
  • 一只眼看世界
    dict1 = {} def fibl(n): if n == 0: return 0 if n == 1: return 1 return (fibl(n-1) if n-1 not in dict1 else dict1[n-1]) + (fibl(n-2) if n-2 not in dict1 else dict1[n-2]) def all_fib(n): global dict1 res =[] for i in range(n + 1): req = fibl(i) dict1[i] = req res.append(req) print(res) all_fib(100000) 老师用的装饰器很高大上(看了好几遍才搞明白), 但是当数字大于995后会有超过递归深度报错, 所以过来皮一下/狗头
    2019-08-14
    2
    8
  • JackLee
    还有一个ipdb是pdb的加强版,用法比较相近,不过需要pip安装一下
    2019-07-19
    7
  • new
    老师应该在这里回顾一下装饰器的用法
    2019-07-22
    6
收起评论
显示
设置
留言
30
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部