Python Memory Profile Notes
文章目录
工具
- 内存分配跟踪 trace memory allocations
- 官方库
- memory_profiler
- 逐行 profile
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 8from 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 5import 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
登记 track 的目标
- tracker.track_object
- tracker.track_class
参数
class
- 目标类
resolution_level
- 0
- 只有当前实例
- 1
- 当前实例 + 直接引用
- 2
- 当前实例 + 直接引用 + 间接引用
记录内存分配变化
- tracker.create_snapshot()
输出记录
- tracker.print_diff()
- tracker.stats.print_summary
输出
系列工具类
- ConsoleStats
HtmlStats
1 2from 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
- object_list 来源于
- 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 模块
- 参考:Identifying memory leaks — Pympler 0.8 documentation
- 作用:引用者查询
工具
- pympler.refbrowser.ConsoleBrowser::print_tree
- pympler.refbrowser.InteractiveBrowser::main()
web 模块
- pympler.web.start_profiler()
- pympler.web.start_in_background()
guppy3
scalene
yappi
文章作者
上次更新 2022-05-26 (ea09227)