如何让Python Pandas脚本利用更多内存以提升运行速度?
优化Pandas代码以提升内存使用率与执行速度
1. 优化数据读取阶段,减少内存冗余
- 显式指定列数据类型,避免Pandas自动推断带来的内存浪费:比如将重复值多的字符串列设为
category类型,整数列根据数值范围选择int32/int16而非默认的int64。示例:df = pd.read_csv('data.csv', dtype={'category_col': 'category', 'small_int_col': 'int32'}) - 仅读取需要的列:用
usecols参数过滤无关列,减少内存加载量。 - 使用高效读取引擎:Pandas 2.0+支持
pyarrow引擎,读取速度更快且内存占用更优:df = pd.read_csv('data.csv', engine='pyarrow', dtype_backend='pyarrow')
2. 启用并行计算,充分利用CPU与内存
Pandas默认单线程执行,会导致内存和CPU利用率双低,可通过以下方式开启并行:
- 用
swifter自动将Series/DF的apply转为并行执行:import swifter df['processed_col'] = df['raw_col'].swifter.apply(your_heavy_function) - 分组聚合操作使用
pandarallel:from pandarallel import pandarallel pandarallel.initialize(nb_workers=8) # 根据CPU核心数设置 df.groupby('group_key').parallel_apply(your_agg_func) - Pandas 2.0+部分操作支持
mode='parallel'参数,比如df.map(),可尝试开启。
3. 精简内存中的数据处理逻辑
- 避免创建不必要的中间DataFrame:用链式操作合并步骤,比如
df = df.dropna().query('value > 10').reset_index(drop=True),而非逐个保存临时变量。 - 用矢量化操作替代Python原生循环:比如用
df['col1'] * df['col2']代替逐行遍历计算,大幅提升效率的同时减少内存碎片化。 - 对复杂数值计算,转为NumPy数组处理:NumPy数组的内存 overhead远低于Pandas Series,计算速度更快。
4. 消除IO瓶颈
如果代码中有频繁的文件/数据库读写,会导致CPU和内存空闲:
- 批量读写操作:将多次小文件写入合并为一次批量操作,比如用
to_csv(mode='a')批量追加,而非循环写入单条数据。 - 切换高效存储格式:将数据转为Parquet或Feather格式,读写速度远快于CSV,且内存占用更少:
# 保存为Parquet df.to_parquet('data.parquet') # 读取Parquet df = pd.read_parquet('data.parquet')
5. 调整Pandas内存配置
- 设置Pandas可用内存上限:通过
pd.set_option('memory_limit', '50GB')明确告知Pandas可以使用更多内存(默认配置可能限制了内存使用率)。
内容的提问来源于stack exchange,提问作者Anushka A
相关产品推荐
相关产品推荐

