使用psutil检测Python内存时嵌套循环内存异常增长问题
为什么用psutil测量Python内存时,嵌套循环里内存看似持续增长?
问题描述
我尝试使用psutil工具测量Python程序的内存使用情况,却发现异常现象:即使未存储或加载任何数据,嵌套for循环中的内存占用仍持续增长。运行以下示例代码:
import os import psutil for i in range(10): print(i) for j in range(5): mem_usage = psutil.Process(os.getpid()).memory_info()[0] / 2 ** 20 print("{}{} MB".format(j,mem_usage))
得到如下输出:
0 0178 MB 1178 MB 2178 MB 3178 MB 4178 MB 1 0178 MB 1178 MB 2178 MB 3178 MB 4178 MB
请问这是什么原因?psutil未实现我预期的功能吗?
回答
哈哈,这个问题其实是个输出格式化的小失误,psutil的工作完全正常,内存根本没有持续增长!
你看你用的格式化字符串是"{}{} MB".format(j,mem_usage),这里把循环变量j和内存数值mem_usage直接拼接在一起了——比如当j=0、mem_usage=178时,输出就变成了0178 MB,看起来像是内存涨到了178MB,下一次j=1就变成1178 MB,仿佛内存跳到了1178MB,但实际上这只是两个值连在一起显示而已,真实的内存一直稳定在178MB左右。
解决方法很简单,只要在格式化字符串里给j和内存数值之间加个分隔符就行,比如空格或者冒号:
import os import psutil for i in range(10): print(i) for j in range(5): mem_usage = psutil.Process(os.getpid()).memory_info()[0] / 2 ** 20 # 用冒号加空格分隔循环变量和内存数值 print("{}: {} MB".format(j, mem_usage))
修正后的输出会变成这样,你就能清楚看到内存没有变化:
0 0: 178 MB 1: 178 MB 2: 178 MB 3: 178 MB 4: 178 MB 1 0: 178 MB 1: 178 MB 2: 178 MB 3: 178 MB 4: 178 MB
另外补充一句:如果你的程序真存在内存泄漏问题,psutil是能准确捕捉到的,但这个案例里完全是输出格式导致的误会~
内容的提问来源于stack exchange,提问作者Mansumen
相关产品推荐
相关产品推荐

