092. 编写一个函数,实现简单的内存分析工具

在 Python 中,可以使用内置的 sysgc 模块,以及第三方库 psutil 来实现一个简单的内存分析工具。以下是一个示例代码,该工具可以实现以下功能:

  1. 显示当前进程的内存使用情况(包括总内存、已用内存、空闲内存等)。
  2. 显示当前 Python 对象的内存占用情况(包括特定对象的内存大小)。
  3. 统计当前 Python 进程中所有对象的内存占用情况

示例代码

import sys
import gc
import psutil
import os

def analyze_memory():
    """
    简单的内存分析工具
    功能:
    1. 显示当前进程的内存使用情况
    2. 显示特定对象的内存占用
    3. 统计当前 Python 进程中所有对象的内存占用情况
    """
    # 获取当前进程的内存使用情况
    process = psutil.Process(os.getpid())
    mem_info = process.memory_info()
    print("当前进程的内存使用情况:")
    print(f"  RSS(常驻内存): {mem_info.rss / (1024 ** 2):.2f} MB")
    print(f"  VMS(虚拟内存): {mem_info.vms / (1024 ** 2):.2f} MB")
    print(f"  内存占用百分比: {process.memory_percent():.2f}%")

    # 显示特定对象的内存占用
    print("\n特定对象的内存占用:")
    obj1 = [1, 2, 3, 4, 5]
    obj2 = "Hello, world!"
    print(f"  列表对象 {obj1}: {sys.getsizeof(obj1)} bytes")
    print(f"  字符串对象 '{obj2}': {sys.getsizeof(obj2)} bytes")

    # 统计当前 Python 进程中所有对象的内存占用情况
    print("\n当前 Python 进程中所有对象的内存占用情况:")
    gc.collect()  # 强制垃圾回收,确保对象统计准确
    all_objects = gc.get_objects()
    total_memory = 0
    object_memory = {}
    for obj in all_objects:
        obj_size = sys.getsizeof(obj)
        total_memory += obj_size
        obj_type = type(obj)
        if obj_type in object_memory:
            object_memory[obj_type] += obj_size
        else:
            object_memory[obj_type] = obj_size

    print(f"  总内存占用: {total_memory / (1024 ** 2):.2f} MB")
    print("  按对象类型统计的内存占用:")
    for obj_type, mem_size in object_memory.items():
        print(f"    {obj_type.__name__}: {mem_size / 1024:.2f} KB")

# 示例用法
analyze_memory()

功能说明

当前进程的内存使用情况

  • 使用 psutil.Process 获取当前进程的内存信息,包括常驻内存(RSS)和虚拟内存(VMS)。

  • 显示内存占用百分比。

特定对象的内存占用:使用 sys.getsizeof 获取特定对象的内存大小。

统计当前 Python 进程中所有对象的内存占用情况

  • 使用 gc.get_objects 获取当前 Python 进程中所有对象。

  • 使用 sys.getsizeof 统计每个对象的内存大小,并按对象类型进行分类统计。

使用方法

将上述代码保存为一个 .py 文件,运行该脚本即可。它会输出当前进程的内存使用情况、特定对象的内存占用情况,以及当前 Python 进程中所有对象的内存占用统计。

注意事项

  • psutil 是一个第三方库,需要通过 pip install psutil 安装。

  • sys.getsizeof 只能获取对象本身的内存大小,对于容器对象(如列表、字典等),它不会计算其中元素的内存占用。如果需要更精确的内存分析,可以使用 pympler 等更高级的库。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)