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

如何提取Pandas DataFrame人类可读格式的内存占用字符串

问题

现有如下测试DataFrame:

import pandas as pd
df = pd.DataFrame({'A': range(1, 10000)})
  • 调用df.info()可以得到友好的人类可读输出,显示该对象内存占用为78.2 KB,输出示例如下:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9999 entries, 0 to 9998
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   A       9999 non-null   int64
dtypes: int64(1)
memory usage: 78.2 KB
  • 调用df.memory_usage()只能得到原始字节数值,结果可读性差,这也是Pandas计算内存占用的底层实现逻辑,我不希望自行编写字节到可读存储单位的转换逻辑。
  • 我追踪过df.info的源码,找到了格式化内存字符串的生成位置,但不清楚该字符串具体的生成逻辑,也不知道如何直接提取该字符串用于日志打印。
  • 我无法直接解析df.info()的输出内容,因为该方法会直接将内容打印到缓冲区,对其调用str()只会返回None。另外源码中仅能找到控制是否打印内存占用的布尔标记,无法直接获取格式化结果。
答案

你不需要自行实现字节单位转换逻辑,也不用通过重定向标准输出的方式强行抓取控制台内容,有两种稳定的实现方案:

方法1:利用buf参数捕获info输出

df.info()原生提供了buf参数用来指定输出的目标流,你可以传入内存中的StringIO对象接收所有输出内容,全程不会向控制台打印任何内容,之后直接提取内存占用对应的行即可:

from io import StringIO

buf = StringIO()
df.info(buf=buf)
info_content = buf.getvalue()

# 提取内存占用字符串
memory_str = [line for line in info_content.splitlines() if line.startswith("memory usage:")][0]

这个方案完全基于Pandas的公开API实现,没有跨版本兼容风险,如果你同时需要info输出的其他字段信息,也可以直接从捕获的文本中提取。

方法2:直接复用Pandas内置的格式化函数

df.info()底层将字节数转换为可读单位的逻辑封装在sizeof_fmt函数中,你可以直接导入这个函数使用,输出结果和info打印的内容完全一致:

from pandas.io.formats.format import sizeof_fmt

# 计算总内存字节数,传入deep=True确保准确计算对象类型占用的内存
total_bytes = df.memory_usage(deep=True).sum()
memory_str = f"memory usage: {sizeof_fmt(total_bytes)}"

这个方案更轻量,适合只需要单独获取内存占用字符串、不需要完整info输出的日志场景。


内容的提问来源于stack exchange,提问作者ifly6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:12:39