Python调试方法和性能分析总结
Python调试
Python的单进程调试方法
Python的单进程调试可直接使用pdb模块进行调试,具体调试方法有两种:
-
直接在Python程序启动时加入pdb模块,例如对foo.py程序进程调试:
python -m pdb foo.py
。 -
在Python程序内部使用pdb:
import pdb ... if __name__ == '__main__': ... # make breakpoint pdb.set_trace() ...
Python的多进程调试方法
-
使用pdb进行调试,需要将子进程的IO进行重定向,然后进行调试,如下代码:
import pdb class ForkedPdb(pdb.Pdb): """A Pdb subclass that may be used from a forked multiprocessing child """"" def interaction(self, *args, **kwargs): _stdin = sys.stdin try: sys.stdin = open('/dev/stdin') pdb.Pdb.interaction(self, *args, **kwargs) finally: sys.stdin = _stdin ... # worker is a subprocess function def worker(): ... # make breakpoint ForkedPdb().set_trace() ... ...
-
使用remote_pdb进行调试,remote_pdb设置断点之后,需要使用telnet之类的工具连接到对应的端口进行调试就行。
import remote_pdb ... # worker is a subprocess function def worker(): ... # make breakpoint remote_pdb.set_trace() ... ...
在调试代码段加入以上内容之后,代码在运行的时候会有端口信息,之后用telnet连接到对应端口就能调试了。
-
直接使用python-gdb支持的gdb进行调试,使用
gdb -p [PID]
进行调试,其中PID为指定的子进程号。需要对gdb加入python支持(对gdb加入python支持本人没有搞好,如果有成功的例子欢迎大家交流)。
Python性能分析
cProfile的简单使用
-
获取数据
-
获取全局数据:运行命令
python -m cProfile -o tmp.prof run.py
之后,会在当前文件夹下面生成关于run.py程序的性能记录文件tmp.prof。 -
记录程序特定代码段的性能数据:
import cProfile import pstats ... profiler = cProfile.Profile() profiler.enable() # code to profile profiler.disable() p = pstats.Stats(profiler).sort_stats('tottime') # p.print_stats(10) # print top 10 # p.strip_dirs() # hide the directory path information p.dump_stats('tmp.prof') # dump the profiling record to file tmp.prof
-
利用gprof2dot工具生成函数关系及占时图
- 安装gprof2dot工具,安装参考gprof2dot的GitHub地址。
- 运行命令
gprof2dot -f pstats tmp.prof | dot -Tsvg -o prof.svg
得到分析图。 - 将生成的 prof.svg 矢量图下载到本地,使用浏览器打开查看即可。
利用KCacheGrind工具来分析
- KCacheGrind Windows系统版本下载地址: KCacheGrind win 。
- 下载pyprof2calltree:
pip install pyprof2calltree
。 - 使用工具pyprof2calltree将收集的pstats数据格式(cprofiler生成的数据格式)转换为valgrind格式:
pyprof2calltree -i tmp.prof -o callgrind.tmp
。 - 从服务器上面将得到的callgrind.tmp文件下载下来并使用KCacheGrind工具打开分析查看。
PS:使用上述性能分析工具只能分析到Python函数的信息,不能分析到Python调用C++库的函数信息。并且得到的函数调用图里面的调用关系有些许省略。
参考文档
Python优化第一步 性能分析实践: https://zhuanlan.zhihu.com/p/24495603
gprof2dot工具: https://github.com/jrfonseca/gprof2dot
KCacheGrind win下载地址: https://sourceforge.net/projects/qcachegrindwin/