计时、调用剖析与内存诊断
Python 性能优化与高并发#Python全栈#第二十一阶段#Python 性能优化与高并发#计时、调用剖析与内存诊断约 913 字 · 3 分钟阅读
追问显示点击任意追问卡片可收起 / 展开
测量代码耗时时,perf_counter 与 process_time 有什么不同?
追问 等待网络、休眠和 CPU 计算分别会怎样影响结果?测量用户等待时间与进程消耗的 CPU 时间,应怎样选择计时口径?
timeit 适合测量什么,不适合独自证明什么?
追问 准备数据、重复执行和垃圾回收设置怎样影响微基准?为什么一个表达式的最佳耗时不能替代完整接口在真实负载下的结果?
怎样使用 cProfile 与 pstats 查找热点?
追问 调用次数、函数自身时间与累计时间各说明什么?为什么不能把调用树中所有函数的累计时间直接相加作为总耗时?
一个函数很快但被调用很多次,应怎样分析?
追问 重复转换、重复查询与循环内初始化如何成为主要成本?怎样区分减少调用次数和缩短单次调用时间的收益?
采样剖析与逐函数调用剖析有什么区别?
追问 采样频率、运行开销、短函数与调用次数统计分别受到什么影响?为什么需要根据工具采集模式判断它主要观察计算还是等待?
阅读火焰图时,应怎样解释横向宽度与调用层级?
追问 宽度是否直接代表某次请求的时间线?看到宽栈后,怎样结合采样方式、请求类型与原始指标进一步确认瓶颈?
异步服务或多进程服务的剖析有哪些额外注意点?
追问 只剖析一个 Worker 能否代表整体服务?协程等待、线程执行和多个进程的结果怎样分别观察,避免把不同口径混成一个总数?
怎样用 tracemalloc 比较两次运行之间的内存分配变化?
追问 何时启动跟踪、怎样选择快照位置与比较范围?它记录的 Python 分配为何不能直接等同于进程全部驻留内存?
对象已经释放,但进程 RSS 没明显下降,应怎样排查?
追问 仍被引用的对象、分配器保留空间、原生库和缓存各有哪些可能?sys.getsizeof 为什么不能直接得到复杂对象包含所有成员的总占用?
怎样控制诊断工具本身对性能测量的影响?
追问 详细日志、调试模式、全量调用追踪与高频内存采样会增加哪些成本?怎样在诊断运行与最终基准运行之间保持清晰区别?
测量工具核对资料: Python:计时接口、timeit、Python 3.13:cProfile 与 pstats、tracemalloc。工具名称与可用功能按实际解释器版本核对,课堂不要求追记新版本新增模块。