如何在低性能损耗下记录Python代码的内存消耗?
解决方案
一、修正psutil的使用方式(推荐,性能影响极小)
你之前用psutil.virtual_memory()获取的是整个容器/主机的系统内存使用,并非当前Python进程的内存消耗,所以数值不会随计算任务变化。正确做法是直接获取当前进程的内存信息:
import psutil from utils import logger def get_memory_usage(): # 获取当前进程对象 process = psutil.Process() # 获取进程内存详情(单位:字节) mem_info = process.memory_info() # 转换为MB并保留两位小数 rss_mb = round(mem_info.rss / 1024 / 1024, 2) # 实际占用的物理内存 vms_mb = round(mem_info.vms / 1024 / 1024, 2) # 虚拟内存大小 logger.info(f"当前进程内存使用: 物理内存 {rss_mb} MB | 虚拟内存 {vms_mb} MB") return rss_mb
在计算任务的关键节点调用该函数即可,比如:
import asyncio async def some_method_to_do_calculations(): # 计算前记录内存 get_memory_usage() # 执行计算步骤1 await step1() get_memory_usage() # 执行计算步骤2 await step2() get_memory_usage() asyncio.run(some_method_to_do_calculations())
二、修正resource模块的使用方式
你之前用ru_maxrss获取的是进程启动以来的内存峰值,数值只会上升不会回落,导致每次调用结果一致。如果想用resource模块获取当前内存,需注意系统差异:
- Linux系统:
ru_idrss(未共享数据段内存)+ru_isrss(未共享栈内存)可近似当前内存占用 - macOS系统:
ru_maxrss直接表示当前内存占用(与Linux行为不同)
适配Linux的示例代码:
import resource from utils import logger def get_memory_usage(): usage = resource.getrusage(resource.RUSAGE_SELF) # 未共享数据段+栈内存,转换为MB current_mem_mb = round((usage.ru_idrss + usage.ru_isrss) / 1024 / 1024, 2) # 同时输出峰值内存 peak_mem_mb = round(usage.ru_maxrss / 1024 / 1024, 2) logger.info(f"当前内存使用: {current_mem_mb} MB | 峰值内存: {peak_mem_mb} MB") return current_mem_mb
三、性能说明
- 以上两种方式性能损耗微乎其微(单次调用耗时仅微秒级),远低于
tracemalloc带来的30%性能下降 - 仅在计算任务的关键环节(如步骤前后)调用,无需持续监控,完全匹配你的需求
内容的提问来源于stack exchange,提问作者FN_
相关产品推荐
相关产品推荐

