工具

line-profiler

  • 命令行使用

    1
    2
    3
    4
    5
    
    # 第一步 ---> 生成 profile 结果文件  --> your_script.py.lprof
    kernprof -l -v your_script.py
    
    # 第二步 ---> 格式化展示
    python -m line_profiler your_script.py.lprof
  • 例子

    • 注意:不需要导入 profile 装饰器
    • Line Profiling in Python · GitHub

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      
      #!/usr/bin/python
      
      from time import sleep
      
      @profile
      def so_slow(bar):
          """ Simulate a slow function. """
          sleep(5)
          return bar
      
      @profile
      def its_time_for_the_calculator(foo):
          """ It's time for the calculator. """
          if not isinstance(foo, int):
          return None
      
          a = []
          for i in xrange(foo):
          a.append(i)
      
          b = so_slow(a)
      
          c = 0
          for i in xrange(foo):
          c += i
      
          return None
      
      def main():
          print its_time_for_the_calculator(100000)
      
      if __name__ == "__main__":
          main()

memory_profiler

行占用分析

  • 类似 line-profiler
  • 相比 line_profiler 更方便
  • 注意:可以不需要导入 profile 装饰器

    • 也可导入

      1
      2
      3
      4
      5
      6
      7
      8
      
      from memory_profiler import profile
      
      @profile(precision=4)
      def my_func():
          a = [1] * (10 ** 6)
          b = [2] * (2 * 10 ** 7)
          del b
          return a

运行程序占用分析

  • mprof run

    • 作用:进行统计
    • 特性

      • –python
    • 启用对函数的统计
    • 注意

      • 只有在运行完成后,才能统计出函数的信息
      • –attach [PID]
    • 统计已经运行的程序
  • mprof plot

    • 作用:统计结果绘图

pympler

asizeof

  • 作用

    • 统计被分配的内存
  • 例子

    1
    2
    3
    4
    5
    
      import sys
      from pympler import asizeof
         
      sys.getsizeof('a')
      asizeof.asizeof('a')
  • 注意

    • 与 sys.getsizeof 不同

      • asizeof.asizeof 递归统计内存占用

工具

  • asizeof.asizeof(obj) –> int 整数
  • asizeof.asized(obj) –> asizeof.Asized 类

    • 信息更全
    • Asized.format() –> str

tracker

  • 位置

    • pympler.tracker 模块

SummaryTrack

ClassTracker

  1. 登记 track 的目标

    • tracker.track_object
    • tracker.track_class
    • 参数

      • class

        • 目标类
      • resolution_level

        0
        只有当前实例
        1
        当前实例 + 直接引用
        2
        当前实例 + 直接引用 + 间接引用
  2. 记录内存分配变化

    • tracker.create_snapshot()
  3. 输出记录

    • tracker.print_diff()
    • tracker.stats.print_summary
输出
  • 系列工具类

    • ConsoleStats
    • HtmlStats

      1
      2
      
      from pympler.classtracker_stats import HtmlStats
      HtmlStats(tracker=tracker).create_html('profile.html')
      • 里面包含记录的所有信息

        • 位置

          • pympler.classtracker_stats 模块
  • 离线存储

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    # 导出
    tracker.stats.dump_stats('profile.dat')
    
    # 导入, ConsoleStats
    from pympler.classtracker_stats import ConsoleStats
    stats = ConsoleStats()
    stats.load_stats('profile.dat')
    stats.sort_stats('size').print_stats(limit=10, clsname='Node')
    
    # 导入, HtmlStats
    from pympler.classtracker_stats import HtmlStats
    stats = HtmlStats(filename='profile.dat')
    stats.create_html('profile.html')

muppy 模块

  • 作用

    • 获取内存中的对象(object)
  • muppy.get_objects()

    • 获取所有 object
  • muppy.filer(objects, Type=your_given_type)

summary 模块

  • 作用

    • 汇总 muppy 获取的对象列表
  • sum = summary.summarize(object_list) :: 汇总

    • object_list 来源于 muppy
  • summary.get_diff :: 比较两个 sum
  • summary.print_(summarized_result) :: 输出

    • 输出单个 sum 或者 diff
  • summary.format_(sum) :: 格式化的 字符串 generator

    • list(summary.format_(sum))

pympler.tracker.SummaryTrack 类 —- 快捷自动化 处理工具

  • SummaryTrack()

    • 处理逻辑

      • 初始化 就会创建一个 sum
      • sum_track.print_diff

        • 再次创建一个 sum
        • 并输出这个 sum 和 上一个 sum 的区别

refbrowser 模块

web 模块

  • pympler.web.start_profiler()
  • pympler.web.start_in_background()

guppy3

scalene

yappi