Python 查看当前环境所有变量的大小
方法一 简单打印
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
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,'|'))
方法三 添加排序
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()
| Variable Name| Memory(M)| ------------------------------------------------------ | b| 7629.39| | c| 848.47| | a| 34.79|
方法四 递归求解
对于列表,字典一类的,直接计算大小得到的数据是错的,以下增加了递归计算,只适用于想要求set, list, tuple, dict以及tensor, numpy的情况
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()
| 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
的文件,其中包含了每行代码的内存使用情况。