Polars在易并行任务中的性能优势是否易被抵消?
Polars与Pandas的并行性能疑问与场景分析
性能基准测试代码
import time import numpy as np import polars as pl n_index = 1000 n_group1 = 30 n_group2 = 100 n_obs = 30000000 df = pl.DataFrame( { "index": np.random.randint(0, n_index, size=n_obs), "group1": np.random.randint(0, n_group1, size=n_obs), "group2": np.random.randint(0, n_group2, size=n_obs), "x": np.random.normal(0, 1, n_obs), "y": np.random.normal(0, 1, n_obs), "z": np.random.normal(0, 1, n_obs), } ) start = time.perf_counter() df.group_by("group1", "group2").agg( pl.mean("x").alias("mean_x"), pl.std("x").alias("std_x"), pl.mean("y").alias("mean_y"), pl.std("y").alias("std_y"), pl.mean("z").alias("mean_z"), pl.std("z").alias("std_z"), ) time.perf_counter() - start >>> 0.3957360839 df2 = df.to_pandas() start = time.perf_counter() df2.groupby(["group1", "group2"])[["x", "y", "z"]].agg(["mean", "std"]) time.perf_counter() - start >>> 4.1365939596
测试结果与初步分析
在32核系统上的测试显示:相同的分组聚合任务中,Polars耗时约0.396秒,Pandas耗时约4.137秒,Polars性能是Pandas的10倍。
该任务属于易并行类型,可按group1拆分数据后启动30个进程让Pandas分别处理。考虑拆分和进程启动的开销后,这种并行化的Pandas方案性能可能和Polars相当甚至更优。
核心疑问
- 对于易并行任务,Polars的性能优势是否容易被其他并行计算方式抵消?
- 在32核系统中,Polars宣称能充分利用所有资源的前提下,其10倍性能提升是否不算真正的优势?
- 是否对Polars和并行计算存在误解?
实际应用场景
某文件夹下有30个sample_i.parquet文件,每个对应group1=i,需生成30个包含各列均值、标准差的结果文件,有三种实现方案:
- 使用Polars的
scan_parquet读取所有文件,为每个文件分配group1后生成大DataFrame,再执行分组聚合 - 启动30个进程,每个进程用Pandas读取单个文件,计算列的均值和标准差并生成结果文件
- 与方案2相同,但改用Polars实现
预期与思考
后续会做基准测试,但预计性能表现为:1 < 2 ≈ 3。若2≈3,是否意味着Polars在大型易并行任务中无法带来显著性能增益?我认为2≈3的原因是两者都能充分利用所有核心。
内容的提问来源于stack exchange,提问作者Keptain
相关产品推荐
相关产品推荐

