Polars中Series+运算与pl.Expr链式add方法的性能差异探究
Polars中两种列加法实现的性能对比
问题
提取DataFrame的两个Series执行+运算,与使用链式pl.Expr调用add方法完成相同计算,二者是否存在显著性能差异?已知二者返回的数据类型不同(前者为Series,后者为单列DataFrame)。
示例代码
import polars as pl df = pl.DataFrame({'a': range(5), 'b': range(0, 50, 10)}) # 方式1:提取Series后执行加法 print(df.get_column('a') + df.get_column('b')) # 输出: # shape: (5,) # Series: 'a' [i64] # [ # 0 # 11 # 22 # 33 # 44 # ] # 方式2:使用Expr的add方法 print(df.select(pl.col('a').add(pl.col('b')))) # 输出: # shape: (5, 1) # ┌─────┐ # │ a │ # │ --- │ # │ i64 │ # ╞═════╡ # │ 0 │ # │ 11 │ # │ 22 │ # │ 33 │ # │ 44 │ # └─────┘
结论
二者不存在显著性能差异,原因如下:
- 底层执行逻辑一致:Polars中Series的运算符重载(如
+)本质上是对Expr方法的封装,最终都会经过相同的查询优化器,执行完全相同的底层计算逻辑。 - 性能差异可忽略不计:唯一的区别仅在于输出结果的容器类型(Series vs 单列DataFrame),这种包装/转换的开销极小,在绝大多数业务场景(包括百万级甚至千万级数据量)下都无法感知。
如果硬要区分极端场景下的细微差距,提取Series做加法可能少一层DataFrame的包装开销,但这种差距完全不影响业务决策,选择哪种方式主要取决于你需要的结果类型:
- 若需要单独的Series结果,优先用第一种方式;
- 若需要将计算整合到多步骤的DataFrame查询流水线中,第二种方式更贴合Polars的链式查询风格。
内容的提问来源于stack exchange,提问作者Des1303
相关产品推荐
相关产品推荐

