Python 查看当前环境所有变量的大小
方法一 简单打印
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def show_memory(unit = 'KB' , threshold = 1 ): '''查看变量占用内存情况 :param unit: 显示的单位,可为`B`,`KB`,`MB`,`GB` :param threshold: 仅显示内存数值大于等于threshold的变量 ''' from sys import getsizeof scale = { 'B' : 1 , 'KB' : 1024 , 'MB' : 1048576 , 'GB' : 1073741824 }[unit] for i in list ( globals ().keys()): memory = eval ( "getsizeof({})" . format (i)) / / scale if memory > = threshold: print (i, memory, unit) if __name__ = = '__main__' : a = [i for i in range ( 10000 )] show_memory( "KB" , 10 ) # a 85 KB |
这个会显示所有的变量,通过threshold筛选
方法二 格式化输出
https://blog.csdn.net/csdndscs/article/details/133279613
1 2 3 4 5 6 7 8 | import sys print ( "{}{: >40}{}{: >10}{}" . format ( '|' , 'Variable Name' , '|' , 'Memory(M)' , '|' )) print ( " ------------------------------------------------------" ) for var_name in dir (): if not var_name.startswith( "_" ): var_size = sys.getsizeof( eval (var_name)) / 1024 * * 2 if var_size> = 1 : #这里只输出所占内存大于等于1M的变量 print ( "{}{: >40}{}{:>10.2f}{}" . format ( '|' ,var_name, '|' ,var_size, '|' )) |
方法三 添加排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import sys def print_size_of_all(th = 1 , nums = 10 ): # th决定选取多少MB以上的, nums决定显示多少个变量 print ( "{}{: >40}{}{: >10}{}" . format ( '|' , 'Variable Name' , '|' , 'Memory(M)' , '|' )) print ( " ------------------------------------------------------" ) var_list = [] for var_name in list ( globals ().keys()): if not var_name.startswith( "_" ): var_size = sys.getsizeof( eval (var_name)) / 1024 * * 2 if var_size> = th: #这里只输出所占内存大于等于th MB的变量 var_list.append((var_name, var_size)) sorted_var_list = sorted (var_list, key = lambda x:x[ 1 ], reverse = True ) nums = len (var_list) if len (var_list) < nums else len (var_list) for v in sorted_var_list[:nums]: print ( "{}{: >40}{}{:>10.2f}{}" . format ( '|' ,v[ 0 ], '|' ,v[ 1 ], '|' )) print_size_of_all() |
1 2 3 4 5 | | Variable Name| Memory(M)| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | b| 7629.39 | | c| 848.47 | | a| 34.79 | |
方法四 递归求解
对于列表,字典一类的,直接计算大小得到的数据是错的,以下增加了递归计算,只适用于想要求set, list, tuple, dict以及tensor, numpy的情况
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import sys import torch import numpy as np def sizeof(obj, seen = None ) - > int : """ 计算Python对象的内存大小。 这个函数可以处理包括列表、元组、字典、集合等在内的Python对象。 """ # 使用getsizeof()函数获取对象的大小,这是一个近似值,因为它不包括对象内部引用的其他对象的大小 size = sys.getsizeof(obj) if seen is None : seen = set () obj_id = id (obj) if obj_id in seen: return 0 # Important mark as seen *before* entering recursion to gracefully handle self-referential objects seen.add(obj_id) # 如果对象是Tensor,则直接返回大小 if isinstance (obj, torch.Tensor): size = obj.numel() * obj.element_size() return size # 如果对象是numpy,则直接返回大小 elif isinstance (obj, np.ndarray): return size # 如果对象可迭代,遍历计算集合中每个元素的大小 if isinstance (obj, ( set , list , tuple )): return size + sum ([sizeof(element, seen) for element in obj]) # 如果对象是一个字典,遍历计算字典中每个键和值的大小 if isinstance (obj, dict ): size + = sum ((sizeof(v, seen) for v in obj.values())) size + = sum ((sizeof(k, seen) for k in obj.keys())) return size return size def print_size_of_all(th = 1 , nums = 10 ): print ( "{}{: >40}{}{: >10}{}" . format ( '|' , 'Variable Name' , '|' , 'Memory(M)' , '|' )) print ( " ------------------------------------------------------" ) var_list = [] for var_name in list ( globals ().keys()): if not var_name.startswith( "_" ): # var_size=sys.getsizeof(eval(var_name))/1024**2 var_size = sizeof( eval (var_name)) / 1024 * * 2 if var_size > = th: # 这里只输出所占内存大于等于th MB的变量 var_list.append((var_name, var_size)) sorted_var_list = sorted (var_list, key = lambda x: x[ 1 ], reverse = True ) nums = len (var_list) if len (var_list) < nums else len (var_list) for v in sorted_var_list[:nums]: print ( "{}{: >40}{}{:>10.2f}{}" . format ( '|' , v[ 0 ], '|' , v[ 1 ], '|' )) return if __name__ = = "__main__" : a = torch.Tensor( 9999999 ) b = { 'a' : 1 , 'b' : [ 1 , 2 , 3 ], 'c' : { 'd' : [a] * 2 }} c = np.zeros( 59861342 ) print_size_of_all() |
1 2 3 4 5 | | Variable Name| Memory(M)| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | c| 456.71 | | b| 38.15 | | a| 38.15 | |
方法五 使用memory_profiler
库
https://blog.csdn.net/weixin_30303283/article/details/140745370
memory_profiler
是一个用于监控Python程序内存使用的库。它可以显示每行代码的内存使用情况。
首先,需要安装memory_profiler
库:
然后,使用@profile
装饰器来监控函数的内存使用情况:
运行上述代码后,会生成一个名为memory_profiler_test.txt
的文件,其中包含了每行代码的内存使用情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix