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

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个包含各列均值、标准差的结果文件,有三种实现方案:

  1. 使用Polars的scan_parquet读取所有文件,为每个文件分配group1后生成大DataFrame,再执行分组聚合
  2. 启动30个进程,每个进程用Pandas读取单个文件,计算列的均值和标准差并生成结果文件
  3. 与方案2相同,但改用Polars实现

预期与思考

后续会做基准测试,但预计性能表现为:1 < 2 ≈ 3。若2≈3,是否意味着Polars在大型易并行任务中无法带来显著性能增益?我认为2≈3的原因是两者都能充分利用所有核心。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:47:36