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

DataFrame处理速度过慢如何优化?pd.concat循环拼接性能问题求解

优化循环中反复执行pd.concat导致的DataFrame性能问题

你推测的原因完全正确:循环内反复调用pd.concat是性能瓶颈的核心。因为每次执行pd.concat都会创建新的DataFrame对象,伴随大量内存分配与数据拷贝操作,循环次数越多,性能损耗越严重。

最优优化方案:先收集数据再一次性构造DataFrame

不要在循环里拼接DataFrame,而是用一个列表存储每次循环生成的字典(或每行数据),循环结束后再一次性将列表转换为DataFrame。这种方式避免了频繁的内存操作,性能提升非常明显。

修改后的代码示例:

# 初始化空列表存储每行数据的字典
data_list = []

for idx, x in enumerate(all_data[0]):
    
    peak_indx_E = ...
    ...
    # 生成当前行的字典数据
    row_data = {
        'idx_global_num': idx, 
        ...
        'peak_sq_divE': peak_sq_divE
    }
    # 将字典添加到列表
    data_list.append(row_data)

# 循环结束后一次性构造完整DataFrame
df_all = pd.DataFrame(data_list)

备选优化方案:按列收集数据

如果数据列是固定的,也可以为每一列单独创建列表,循环中向对应列表添加数据,最后一次性构造DataFrame。这种方式在数据量极大时,内存效率可能更高:

# 初始化各列的空列表
idx_global_num_list = []
...
peak_sq_divE_list = []

for idx, x in enumerate(all_data[0]):
    
    peak_indx_E = ...
    ...
    # 向各列列表添加对应数据
    idx_global_num_list.append(idx)
    ...
    peak_sq_divE_list.append(peak_sq_divE)

# 一次性构造DataFrame
df_all = pd.DataFrame({
    'idx_global_num': idx_global_num_list,
    ...
    'peak_sq_divE': peak_sq_divE_list
})

为什么这两种方式更快?

  • 列表的append操作是原地修改,内存开销极小;
  • 一次性构造DataFrame只进行一次内存分配和数据整理,避免了循环中多次拷贝数据的损耗;
  • 当循环次数超过100次时,这种优化的速度提升会非常显著(通常能快几十甚至上百倍)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:55:18