Python 查看当前环境所有变量的大小

方法一 简单打印

https://blog.csdn.net/lly1122334/article/details/104757467

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库:

pip install memory_profiler
 

然后,使用@profile装饰器来监控函数的内存使用情况:

 
from memory profiler import profile

@profile
def test():
    a = [i for i in range(1000000)]

test()

  

运行上述代码后,会生成一个名为memory_profiler_test.txt的文件,其中包含了每行代码的内存使用情况。

posted @ 2024-08-15 23:17  evtricks  阅读(54)  评论(0编辑  收藏  举报