092. 编写一个函数,实现简单的内存分析工具
在 Python 中,可以使用内置的 sys
和 gc
模块,以及第三方库 psutil
来实现一个简单的内存分析工具。以下是一个示例代码,该工具可以实现以下功能:
- 显示当前进程的内存使用情况(包括总内存、已用内存、空闲内存等)。
- 显示当前 Python 对象的内存占用情况(包括特定对象的内存大小)。
- 统计当前 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)