Pandas与列表:修改值的速度对比及差异原因探究
为什么循环修改Pandas列值比修改列表值慢这么多?
测试代码
from time import perf_counter import pandas as pd example_list = [0 for _ in range(1000000)] start = perf_counter() for i in range(1000000): example_list[i] = i end = perf_counter() print(f"Speed of list: {end-start}") example_dataframe = pd.DataFrame([0 for _ in range(1000000)]) start = perf_counter() for i in range(1000000): example_dataframe.loc[i, 0] = i end = perf_counter() print(f"Speed of dataframe: {end-start}")
测试结果
Speed of list: 0.034354630000052566 Speed of dataframe: 21.46266417700008
核心原因分析
- 列表的底层操作极轻量:Python列表是动态数组结构,通过索引直接赋值时,就是对内存位置的直接修改,几乎没有额外逻辑,效率自然拉满。
- Pandas的
loc单次访问有大量隐性开销:每一次loc[i, 0]的调用,Pandas都要做一堆额外工作:- 校验索引和列的合法性
- 判断当前操作是修改视图还是副本(防止链式赋值的歧义问题)
- 维护列的数据类型一致性,避免意外变更
- 更新内部缓存和状态
单次开销看似不大,但100万次循环下来,这些开销会被无限放大,最终导致耗时差了好几百倍。
- Pandas的设计初衷是向量化操作:Pandas从根本上就是为批量运算优化的,逐元素循环完全绕开了它的优化机制。如果换成向量化赋值,速度会和列表差不多:
这种方式会一次性对整列完成赋值,利用NumPy的底层优化,彻底避免循环带来的额外消耗。example_dataframe[0] = range(1000000)
内容的提问来源于stack exchange,提问作者Qeyzho
相关产品推荐
相关产品推荐

