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
相关产品推荐
相关产品推荐

