Python单for循环与多列表推导式处理400万行Pandas数据的速度对比疑问
性能对比结论
- 你当前使用的逐行调用
iloc访问/赋值DataFrame的写法是所有方案中性能最差的:每次iloc操作都会触发Pandas的索引校验、类型检查等额外开销,400万行规模下耗时会是向量化操作的几十到上百倍。 - 针对你关心的单轮for循环和多条列表推导的对比:列表推导本身的执行效率确实高于普通Python for循环,因为其迭代逻辑在C层面实现,省去了Python字节码循环的额外开销。但如果拆分为10+条列表推导,相当于需要完整遍历10+次全量数据,400万行规模下,多次遍历的开销会完全覆盖列表推导的性能优势,此时整合所有操作的单轮for循环(遍历Python原生序列而非DataFrame的
iloc)性能会优于多条列表推导。
针对Pandas数据治理场景的优化建议
- 优先选择Pandas向量化操作实现所有处理逻辑,完全避免Python层面的循环
你示例中的两个处理逻辑可以直接改写为向量化实现,性能提升最明显:
上述实现无需显式循环,所有逻辑都在Pandas底层执行,400万行规模下耗时通常在秒级。# 生成Price_Dummy,错误值默认转为0/可按需求调整 dataframe["Price_Dummy"] = (dataframe["Price"].astype(str) != "0").astype(int) # Size单位统一转换为MB size_split = dataframe["Size"].str.split(expand=True) size_num = pd.to_numeric(size_split[0], errors="coerce") size_unit = size_split[1].str.lower() unit_map = {"kb": 1/1000, "mb": 1, "gb": 1000} dataframe["Size"] = size_num * size_unit.map(unit_map) - 若存在无法用向量化实现的复杂逻辑,优先将DataFrame列转为Python原生列表后做单轮遍历,处理完成后统一赋值回DataFrame,不要在循环中反复调用
iloc操作DataFrame。 - 若确实需要在Python层面实现循环,优先选择单轮循环整合所有处理逻辑,而非拆分为多条列表推导:百万行级以上的数据集,多次遍历的开销远大于列表推导本身的性能增益。
百万行规模下的常见方案性能参考
- 逐行
iloc循环:约180~220s/100万行 - 10条列表推导:约25~35s/100万行
- 单轮遍历Python原生列表处理:约7~12s/100万行
- Pandas向量化操作:约0.3~1s/100万行
内容的提问来源于stack exchange,提问作者KArrow'sBest
相关产品推荐
相关产品推荐

