Python核心技术与实战
景霄
Facebook资深工程师
立即订阅
13891 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从工程的角度深入理解Python
免费
基础篇 (14讲)
01 | 如何逐步突破,成为Python高手?
02 | Jupyter Notebook为什么是现代Python的必学技术?
03 | 列表和元组,到底用哪一个?
04 | 字典、集合,你真的了解吗?
05 | 深入浅出字符串
06 | Python “黑箱”:输入与输出
07 | 修炼基本功:条件与循环
08 | 异常处理:如何提高程序的稳定性?
09 | 不可或缺的自定义函数
10 | 简约不简单的匿名函数
11 | 面向对象(上):从生活中的类比说起
12 | 面向对象(下):如何实现一个搜索引擎?
13 | 搭建积木:Python 模块化
14 | 答疑(一):列表和元组的内部实现是怎样的?
进阶篇 (11讲)
15 | Python对象的比较、拷贝
16 | 值传递,引用传递or其他,Python里参数是如何传递的?
17 | 强大的装饰器
18 | metaclass,是潘多拉魔盒还是阿拉丁神灯?
19 | 深入理解迭代器和生成器
20 | 揭秘 Python 协程
21 | Python并发编程之Futures
22 | 并发编程之Asyncio
23 | 你真的懂Python GIL(全局解释器锁)吗?
24 | 带你解析 Python 垃圾回收机制
25 | 答疑(二):GIL与多线程是什么关系呢?
规范篇 (7讲)
26 | 活都来不及干了,还有空注意代码风格?!
27 | 学会合理分解代码,提高代码可读性
28 | 如何合理利用assert?
29 | 巧用上下文管理器和With语句精简代码
30 | 真的有必要写单元测试吗?
31 | pdb & cProfile:调试和性能分析的法宝
32 | 答疑(三):如何选择合适的异常处理方式?
量化交易实战篇 (8讲)
33 | 带你初探量化世界
免费
34 | RESTful & Socket: 搭建交易执行层核心
35 | RESTful & Socket: 行情数据对接和抓取
36 | Pandas & Numpy: 策略与回测系统
免费
37 | Kafka & ZMQ:自动化交易流水线
38 | MySQL:日志和数据存储系统
39 | Django:搭建监控平台
40 | 总结:Python中的数据结构与算法全景
技术见闻与分享 (4讲)
41 | 硅谷一线互联网公司的工作体验
42 | 细数技术研发的注意事项
加餐 | 带你上手SWIG:一份清晰好用的SWIG编程实践指南
43 | Q&A:聊一聊职业发展和选择
结束语 (1讲)
结束语 | 技术之外的几点成长建议
Python核心技术与实战
登录|注册

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

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

用 pdb 进行代码调试

pdb 的必要性

首先,我们来看代码的调试。也许不少人会有疑问:代码调试?说白了不就是在程序中使用 print() 语句吗?
没错,在程序中相应的地方打印,的确是调试程序的一个常用手段,但这只适用于小型程序。因为你每次都得重新运行整个程序,或是一个完整的功能模块,才能看到打印出来的变量值。如果程序不大,每次运行都非常快,那么使用 print(),的确是很方便的。
但是,如果我们面对的是大型程序,运行一次的调试成本很高。特别是对于一些 tricky 的例子来说,它们通常需要反复运行调试、追溯上下文代码,才能找到错误根源。这种情况下,仅仅依赖打印的效率自然就很低了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • return
    全文这个装饰器最牛逼。
    2019-07-19
    25
  • AllenGFLiu
    哥,不怀好意的问一下,你们在谷歌会用微软的vscode 吗?[奸笑脸]
    每次看你都是提到pycharm ,我是从pycharm 转到vscode 上的,感觉整个世界都安静了。

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

    2019-07-19
    2
    5
  • ( ̄_ ̄ )
    和gdb的命令差不多
    2019-07-19
    4
  • lipan
    最近在用js撸小程序,一个console.log()搞定所有调试。
    2019-07-19
    1
    3
  • Ray
    您好,pdb调试多线程的时候目前还不支持吧
    2019-07-25
    2
  • 一只眼看世界
    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
    1
  • new
    老师应该在这里回顾一下装饰器的用法
    2019-07-22
    1
  • JackDong
    还有一个ipdb是pdb的加强版,用法比较相近,不过需要pip安装一下
    2019-07-19
    1
  • 自由民
    多数是直接用IDE里的功能来调试,另外用过Linux里的gdb。调优没用过,顶多在代码里直接计时。
    2019-10-21
  • xavier
    对应到C、C++就是gdb。现在被IDE给宠坏了,感觉还是Command Line纯粹。

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

    2019-08-15
  • SuQiu
    PySnooper这个调试挺好。
    2019-07-23
  • Geek_d848f7
    get到新方法,我只用过print、断点、装饰器的方式,print用得最多(😓)
    2019-07-22
  • 小侠龙旋风
    我要把这个装饰器保存下来

    作者回复: 哈哈好

    2019-07-21
  • leixin
    ipython 好像也带debug模式
    2019-07-20
  • Claywoow
    最近工作的一段时间一直在用pdb调试。。。pdb大法好啊 : )
    2019-07-20
  • 🇨🇳
    老师您好,最近使用requests.get方法遇到一个问题,返回结果部分内容是“<noscript>You need to enable JavaScript to run this app.</noscript>”,请问您遇到过这种情况吗,怎么解决呢。谢谢
    2019-07-19
  • 未来已来
    被最后那个装饰器惊艳到了,以前只知道用循环,没想到 Python 还可以这么玩
    2019-07-19
  • 321
    web 应用怎么调试?譬如flask或django框架开发的应用,该如何调试。

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

    2019-07-19
  • ikimiy
    python的pdb package和Linux下的pdb debug工具很类似
    2019-07-19
收起评论
19
返回
顶部