Python调试方法和性能分析总结

Python调试方法和性能分析总结

    • Python调试
      • Python的单进程调试方法
      • Python的多进程调试方法
    • Python性能分析
      • cProfile的简单使用
      • 利用gprof2dot工具生成函数关系及占时图
      • 利用KCacheGrind工具来分析
    • 参考文档

Python调试

Python的单进程调试方法

Python的单进程调试可直接使用pdb模块进行调试,具体调试方法有两种:

  1. 直接在Python程序启动时加入pdb模块,例如对foo.py程序进程调试: python -m pdb foo.py

  2. 在Python程序内部使用pdb:

    import pdb
    ...
    if __name__ == '__main__':
    	...
    	# make breakpoint
    	pdb.set_trace()
    	...
    

Python的多进程调试方法

  1. 使用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()
    	...
    ...
    
  2. 使用remote_pdb进行调试,remote_pdb设置断点之后,需要使用telnet之类的工具连接到对应的端口进行调试就行。

    import remote_pdb
    ...
    # worker is a subprocess function
    def worker():
    	...
    	# make breakpoint
    	remote_pdb.set_trace()
    	...
    ...
    

    在调试代码段加入以上内容之后,代码在运行的时候会有端口信息,之后用telnet连接到对应端口就能调试了。

  3. 直接使用python-gdb支持的gdb进行调试,使用gdb -p [PID]进行调试,其中PID为指定的子进程号。需要对gdb加入python支持(对gdb加入python支持本人没有搞好,如果有成功的例子欢迎大家交流)。

Python性能分析

cProfile的简单使用

  1. 获取数据

    1. 获取全局数据:运行命令 python -m cProfile -o tmp.prof run.py 之后,会在当前文件夹下面生成关于run.py程序的性能记录文件tmp.prof。

    2. 记录程序特定代码段的性能数据:

      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工具生成函数关系及占时图

  1. 安装gprof2dot工具,安装参考gprof2dot的GitHub地址。
  2. 运行命令 gprof2dot -f pstats tmp.prof | dot -Tsvg -o prof.svg 得到分析图。
  3. 将生成的 prof.svg 矢量图下载到本地,使用浏览器打开查看即可。

利用KCacheGrind工具来分析

  1. KCacheGrind Windows系统版本下载地址: KCacheGrind win 。
  2. 下载pyprof2calltree: pip install pyprof2calltree
  3. 使用工具pyprof2calltree将收集的pstats数据格式(cprofiler生成的数据格式)转换为valgrind格式:pyprof2calltree -i tmp.prof -o callgrind.tmp
  4. 从服务器上面将得到的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/

你可能感兴趣的:(性能调优,python,调试,性能分析,可视化)