使用tracemalloc对python内存进行分析

2,874 阅读2分钟

tracemalloc在python3中自带,无需安装,可以对程序中每一行的代码的内存使用情况进行分析。

下面我们可以看一个例子,对比运行某一些程序后,内存前后使用差异:

import tracemalloc
from copy import deepcopy

tracemalloc.start()
#运行一行代码
s=[[j for j in range(512)] for i in range(512)]
#快照一下
snapshot1 = tracemalloc.take_snapshot()
#运行两行代码
t=[[j for j in range(1024)] for i in range(1024)]
p=t.copy()
dp=deepcopy(t)
#print(t[:2])
#快照一下
snapshot2 = tracemalloc.take_snapshot()
#对比一下前后快照结果
top_stats = snapshot2.compare_to(snapshot1, 'lineno')
for stat in top_stats:
    print(stat)

运行结果如下:

ttr.py:10: size=29.8 MiB (+29.8 MiB), count=787460 (+787460), average=40 B
D:\Anaconda3\lib\copy.py:215: size=8970 KiB (+8970 KiB), count=1027 (+1027), average=8944 B
D:\Anaconda3\lib\copy.py:211: size=64.1 KiB (+64.1 KiB), count=1025 (+1025), average=64 B
ttr.py:11: size=8256 B (+8256 B), count=2 (+2), average=4128 B
D:\Anaconda3\lib\copy.py:150: size=1376 B (+1376 B), count=3 (+3), average=459 B
D:\Anaconda3\lib\tracemalloc.py:397: size=656 B (+656 B), count=5 (+5), average=131 B
D:\Anaconda3\lib\tracemalloc.py:534: size=552 B (+552 B), count=3 (+3), average=184 B
ttr.py:12: size=536 B (+536 B), count=1 (+1), average=536 B
D:\Anaconda3\lib\copy.py:185: size=472 B (+472 B), count=1 (+1), average=472 B
D:\Anaconda3\lib\copy.py:139: size=240 B (+240 B), count=2 (+2), average=120 B
D:\Anaconda3\lib\copy.py:213: size=144 B (+144 B), count=2 (+2), average=72 B
D:\Anaconda3\lib\tracemalloc.py:291: size=112 B (+112 B), count=2 (+2), average=56 B
D:\Anaconda3\lib\copy.py:266: size=64 B (+64 B), count=1 (+1), average=64 B
D:\Anaconda3\lib\tracemalloc.py:289: size=56 B (+56 B), count=1 (+1), average=56 B
ttr.py:6: size=5710 KiB (+0 B), count=131578 (+0), average=44 B
D:\Anaconda3\lib\tracemalloc.py:532: size=64 B (+0 B), count=1 (+0), average=64 B

我们可以看到,每一行运行的内存使用情况,s=[[j for j in range(512)] for i in range(512)]这一行内存大小为5710 KiB,t=[[j for j in range(1024)] for i in range(1024)]这一行内存使用大小为29.8MiB,足见差异之大。 仔细分析还好发现deepcopy()需要的内存比直接copy()的内存小。 tracemalloc最大的用处就是分析程序的内存使用情况,看看那些代码内存使用较多,可以对其进行优化。

并且tracemalloc对原运行的代码修改不用太多,非常容易上手,以后遇到内存分析千万要记起来tracemalloc这个强大的库。