gpt4 book ai didi

python - 在条件连接 + groupby/agg 上下文中,Polars 比 DuckDB 慢得多

转载 作者:行者123 更新时间:2023-12-03 07:54:14 27 4
gpt4 key购买 nike

对于以下示例,其中涉及自条件联接和后续的 groupby/aggregate 操作。事实证明,在这种情况下,DuckDB 的性能比 Polars 好得多(在 32 核机器上约为 10 倍)。

我的问题是:

  1. Polars 速度缓慢(相对于 DuckDB)的潜在原因可能是什么?
  2. 我是否错过了在 Polars 中执行相同操作的其他更快方法?
import time

import duckdb
import numpy as np
import polars as pl

## example dataframe
rng = np.random.default_rng(1)

nrows = 5_000_000
df = pl.DataFrame(
dict(
id=rng.integers(1, 1_000, nrows),
id2=rng.integers(1, 10, nrows),
id3=rng.integers(1, 500, nrows),
value=rng.normal(0, 1, nrows),
)
)

## polars
start = time.perf_counter()
res = (
df.lazy()
.join(df.lazy(), on=["id", "id2"], how="left")
.filter(
(pl.col("id3") > pl.col("id3_right"))
& (pl.col("id3") - pl.col("id3_right") < 30)
)
.groupby(["id2", "id3", "id3_right"])
.agg(pl.corr("value", "value_right"))
.collect(streaming=True)
)
time.perf_counter() - start
# 120.93155245436355

## duckdb
start = time.perf_counter()
res2 = (
duckdb.sql(
"""
SELECT df.*, df2.id3 as id3_right, df2.value as value_right
FROM df JOIN df as df2
ON (df.id = df2.id
AND df.id2 = df2.id2
AND df.id3 > df2.id3
AND df.id3 - df2.id3 < 30)
"""
)
.aggregate(
"id2, id3, id3_right, corr(value, value_right) as value",
"id2, id3, id3_right",
)
.pl()
)
time.perf_counter() - start
# 18.472263277042657

最佳答案

编辑:2023-7-18

最新发布的 Polars 已将差异从 15 倍缩小到 2 倍。

polars v0.18.2  1125
polars v0.18.3 140
duckdb 0.8.2-dev1 75

原始答案

流媒体引擎

流媒体 API 尚未优化。 Polars 是一个比 DuckDB 更年轻的项目,我们没有那么多付费开发人员参与该项目。

请给我们时间。下一个版本 0.18.3 将获得 PR,可以使流式 groupby 速度提高 3.5 倍以上 https://github.com/pola-rs/polars/pull/9346 .

这只是表明我们在流媒体引擎上还有多少可用空间。我们仍然需要对流连接进行同样的优化。

简而言之。我们的流媒体引擎正处于 alpha 阶段。该工作正在进行中。

不同的算法

除此之外,duckdb 查询也可能在底层使用非等值连接,而我们在 Polars 中还没有这种连接,因此该查询对于 Polars 可能不是最佳的。

关于python - 在条件连接 + groupby/agg 上下文中,Polars 比 DuckDB 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76478913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com