如何提升列表转Pandas DataFrame并追加至同长DataFrame的效率?
优化嵌套循环生成重复序列的方法
首先,咱们先明确你这段代码的核心需求:把原DataFrame的每一行索引(从0到len(df)-1)重复10000次,生成一个长列表experiment_list,之后应该是要把这个列表和另一个同长度的DataFrame合并对吧?
你说的完全没错,嵌套Python循环+频繁append是效率低下的关键——Python级别的循环在处理几十万/几百万条数据时,速度会被C实现的向量化操作甩好几条街。下面给你几个高效的优化方案:
方案1:用Numpy的repeat函数(最快的选择之一)
Numpy的向量化操作专门为这类重复/广播场景设计,底层由C实现,速度远超Python循环:
import numpy as np # 生成重复的索引数组 experiment_array = np.repeat(np.arange(len(df)), 10000) # 如果确实需要列表格式(其实直接用数组给Pandas即可,无需转list) experiment_list = experiment_array.tolist()
方案2:直接用Pandas内置的repeat方法(更贴合DataFrame场景)
如果你的最终目标是把原DataFrame的每一行重复10000次后和另一个DataFrame合并,那可以直接对原DataFrame的索引做repeat,一步到位,连单独生成experiment_list都省了:
# 把原df的每一行重复10000次 df_repeated = df.loc[df.index.repeat(10000)] # 如果需要保留原行索引的"i"值,直接添加列即可 df_repeated["experiment_id"] = df_repeated.index # 之后直接和另一个同长度的DataFrame合并(比如用pd.concat或直接赋值列)
为什么这些方法更快?
- 原来的嵌套循环是逐次在Python层面执行
append操作,哪怕append的平均时间复杂度是O(1),但循环10000*len(df)次的开销依然巨大; - Numpy/Pandas的方法是一次性在底层完成所有重复操作,避免了Python循环的额外开销,数据量越大,速度差距越明显(比如当df有1000行时,原代码要执行1e7次循环,而Numpy只需要一次操作)。
额外小提示
如果你的number_of_runs只是用来确定重复次数(10000次),那完全不需要生成这个列表,直接用数字10000就行,还能节省内存。
内容的提问来源于stack exchange,提问作者Alexander Caskie
相关产品推荐
相关产品推荐

