memory_profiler与tracemalloc内存分析实战
请介绍Python内存分析工具memory_profiler、tracemalloc、objgraph和pympler的用法,以及定位内存泄漏的方法。
回答
编译有声
memory_profiler:逐行分析内存使用。
# pip install memory_profiler
from memory_profiler import profile
@profile
def my_func():
a = [i for i in range(100000)]
b = [i**2 for i in range(100000)]
return a, b
运行后输出每行代码的内存增量和当前使用量。
tracemalloc(Python 3.4+,标准库):
import tracemalloc
tracemalloc.start()
# ... 运行代码 ...
snapshot = tracemalloc.take_snapshot()
stats = snapshot.statistics('lineno') # 按行号统计
for stat in stats[:10]:
print(stat)
可追踪每个内存分配的堆栈信息,精准定位泄漏源。
objgraph:可视化对象引用图,查找循环引用。
objgraph.show_refs([obj], filename='refs.png')
objgraph.show_backrefs([obj], filename='backrefs.png')
pympler:全面内存分析,包括asizeof()精确计算对象大小、muppy跟踪所有对象、Class Tracker跟踪类实例变化。
定位泄漏:用tracemalloc对比两次快照,找出持续增长的对象。