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

为何Pandas中多列(>100列)DataFrame的itertuples比iterrows慢?

Pandas行迭代:iterrows()与itertuples()的性能随列数变化分析

通常大家认为在遍历Pandas DataFrame行时,itertuples()的速度比iterrows()快,但这个结论只在列数少的「窄DataFrame」里成立;当DataFrame有数百列变成宽表时,这个结论就不适用了。这种现象正常吗?itertuples()的性能随列数变化不该和iterrows()一样,是常数时间而非线性时间吗?

以下是展示当DataFrame宽度增加时,iterrows()取代itertuples()成为最快迭代方式交叉点的代码片段:

import pandas as pd
import time
from pylab import *
size_range = [100, 300, 600, 1200]
nrows = 100000
compute_time_rows = zeros(len(size_range))
compute_time_tuples = zeros(len(size_range))

for s, size in enumerate(size_range):
  x = pd.DataFrame(randn(nrows, size))
  start = time.time()
  for idx, row in x.iterrows(): z = sum(row)
  stop = time.time()
  compute_time_rows[s] = stop - start
  start = time.time()
  for row in x.itertuples(index=False): z = sum(row)
  stop = time.time()
  compute_time_tuples[s] = stop - start

xlabel('Dataframe width')
ylabel('Computation time [s]')
pd.Series(compute_time_rows, index=size_range).plot(grid=True, label='iterrows')
pd.Series(compute_time_tuples, index=size_range).plot(grid=True, label='itertuples')
title(f'Iteration over a {nrows} rows Pandas dataframe')
legend()

行迭代速度与DataFrame宽度关系

现象解析

底层实现差异导致性能趋势不同

  • iterrows()每次迭代返回Series对象,它直接引用DataFrame的底层numpy数据块,执行sum(row)时,本质是调用numpy的向量化求和操作,这部分开销不会随列数增加明显上升。
  • itertuples()默认返回namedtuple,当列数增多时,创建大量包含数百个字段的namedtuple会产生显著额外开销:Python实例化多字段namedtuple时,需要处理更多属性映射与内存分配,这个开销随列数增加呈线性增长。

求和操作的效率差异

处理Series的sum(row)是Pandas优化后的批量操作,而处理namedtuple的sum(row)需要遍历tuple中每个元素逐一累加,列数越多,这种遍历的开销被放大得越明显。

结论

这种现象完全正常,两者性能随列数的变化趋势并不一致:

  • 窄表场景下,namedtuple的轻量化特性让itertuples()拥有速度优势;
  • 宽表场景下,iterrows()返回的Series能借助numpy向量化操作,同时避免多字段namedtuple的创建开销,反超itertuples()成为更快的迭代方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:40:03