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

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从根本上就是为批量运算优化的,逐元素循环完全绕开了它的优化机制。如果换成向量化赋值,速度会和列表差不多:
    example_dataframe[0] = range(1000000)
    
    这种方式会一次性对整列完成赋值,利用NumPy的底层优化,彻底避免循环带来的额外消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:42:37