You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在低性能损耗下记录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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:52:33