Python Pandas 内存优化技巧

6次阅读

关键是从数据类型、读取方式和操作习惯三方面精简内存:用合适 dtype(如 category、int32)省 50%+ 内存;read_csv 时用 usecols、dtype、chunksize 控制加载;操作中避免隐式复制,及时 del + gc.collect() 释放。

Python Pandas 内存优化技巧

python pandas 处理大数据时容易内存爆满,关键不是换工具,而是从数据类型、读取方式和操作习惯三方面精简内存占用。

用对数据类型,省下 50% 以上内存

Pandas 默认用 int64、float64 和 Object 类型读取数据,但很多列实际不需要这么“宽”。比如:ID 列可能只是 1~10000 的整数,用 int32 就够;类别字段(如省份、状态)用 category 类型可压缩 70%+ 内存;字符串列若重复值多,转 category 效果更明显。

  • 检查每列 dtype 和内存占比:df.info(memory_usage='deep')
  • 自动优化数值类型pd.to_numeric(s, downcast='unsigned')downcast='Integer'
  • 转换类别型字段:df['col'] = df['col'].astype('category')
  • 对时间列优先用 datetime64[ns],避免存成 object 字符串

读取阶段就控制内存,别等加载完再后悔

pd.read_csv() 时默认把所有行、所有列全读进内存。其实多数分析只需部分数据。

  • usecols 只读需要的列,跳过无用字段(如日志中的原始 json 字符串)
  • dtype 参数提前指定每列类型,防止 Pandas 自动推断成高内存类型
  • 大文件分块读取:chunksize=10000,配合 for chunk in pd.read_csv(...) 流式处理
  • low_memory=False 避免混合类型警告导致的重复解析开销

操作中避免隐式复制,减少临时对象

看似简单的链式操作,可能在后台生成多个完整副本。比如 df[df['x']>0].copy().reset_index(drop=True) 至少创建 2 次拷贝。

立即学习Python免费学习笔记(深入)”;

  • inplace=True 替代赋值(仅限支持该参数的方法,如 drop()fillna()
  • 筛选后立即释放原 df 引用:df = df[df['x']>0]; del original_df
  • 不用 df.assign() 做大量列计算,改用直接赋值或 loc 批量写入
  • 合并前确认 key 列已设为 category 或数值型,避免 join 时升格为 object

用完就删,显式释放不用的数据

Python 垃圾回收不保证立刻释放,尤其在 jupyter 中变量长期存在。主动清理很有效。

  • del df 删除大变量后,加 gc.collect() 强制回收(需 import gc
  • Jupyter 中运行 %whos 查看当前变量大小,快速定位“内存大户”
  • 中间结果及时写入磁盘(如 to_parquet()),后续用 read_parquet() 按需加载列
  • 避免把整个原始 DataFrame 一直保留在全局作用域封装成函数局部变量更易回收
text=ZqhQzanResources