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

方法一 简单打印

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

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

pip install memory_profiler
 

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

 
1
2
3
4
5
6
7
from memory profiler import profile
 
@profile
def test():
    a = [i for i in range(1000000)]
 
test()

  

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

posted @   evtricks  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示
即使人生是一场悲剧,也应该笑着把人生演完。