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的文件,其中包含了每行代码的内存使用情况。

浙公网安备 33010602011771号