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

无需列表推导式,如何高效向量化切片百万级Pandas Series?

高效批量切片Pandas Series的向量化方案

当处理百万级别的Series和切片组时,循环调用iloc会带来巨大的性能开销,核心优化思路是一次性批量处理所有索引,利用numpy的向量化操作替代循环。以下是几种可行方案:

方案1:等长切片的快速处理

如果所有切片的长度一致(如示例中每组3个元素),可以将所有索引合并后一次性取值,再重塑形状:

import pandas as pd
import numpy as np

# 模拟百万级数据
series = pd.Series(np.arange(1500000))
slices = [list(range(i*3, (i+1)*3)) for i in range(1500000)]

# 向量化处理步骤
all_indices = np.concatenate(slices)
# 一次性取出所有元素,再重塑为每组对应长度的二维数组
result = series.iloc[all_indices].to_numpy().reshape(-1, len(slices[0]))

这种方式只执行一次索引操作,完全避免了循环的额外开销,性能比列表推导式提升数倍甚至数十倍。

方案2:不等长切片的处理

若切片长度不固定,可先批量取值,再根据切片长度拆分结果:

import pandas as pd
import numpy as np

series = pd.Series(np.arange(1500000))
# 模拟不同长度的切片组
slices = [list(range(i, i+np.random.randint(2,5))) for i in range(0, 1500000, 4)]

# 合并所有索引并批量取值
all_indices = np.concatenate(slices)
values = series.iloc[all_indices].to_numpy()

# 根据每个切片的长度拆分结果
slice_lengths = [len(s) for s in slices]
result = np.split(values, np.cumsum(slice_lengths)[:-1])

np.split是numpy的向量化拆分操作,比循环拆分效率高得多。

方案3:直接使用numpy数组进一步提速

如果业务允许脱离Pandas Series,直接将其转换为numpy数组后使用take方法,能进一步减少Pandas的封装开销:

series_np = series.to_numpy()
all_indices = np.concatenate(slices)
values = series_np.take(all_indices)

# 后续重塑或拆分同方案1/2

numpy的底层实现更贴近硬件优化,在超大规模数据下性能优势更明显。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:15:34