Polars在简单算术运算中的性能是否如预期那样慢于Numpy?

piztneat  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(165)

我的基准测试任务只是裁剪元素的值。我已经使用numpypolars完成了这一点。但是,事实证明,使用numpy比使用polars快得多(约5倍)(如下所示)。
我的问题是

  • 这种行为是否如预期的那样?
  • 如果是这样,这是否意味着polars(尽管它针对join/groupby进行了高度优化)可能不适合执行相对简单的数值向量/数组操作,例如我的示例中的裁剪?
import timeit
import numpy as np
import polars as pl

N = 10_000_000
x = np.random.normal(size=N)
y = np.random.normal(size=N)
z = y + 0.5
df = pl.DataFrame({"x": x, "y": y, "z": z})

>>> timeit.timeit(lambda: np.minimum(np.maximum(x, y), z), number=10)
0.60923

>>> timeit.timeit(lambda: df.select(pl.min(pl.max(pl.col("x"), pl.col("y")), pl.col("z"))), number=10)
3.39337
j9per5c4

j9per5c41#

2023年4月25日更新

polars >= 0.17.8开始,我们对其进行了更多的优化。现在更近了。
我们的水平min操作并没有真正优化。如果你打开一个问题,我们可以改进它。我们的大部分优化注意力都集中在昂贵的操作上。

看情况

回答你的问题,不,这取决于。

  • Polars可以为列式操作实现相同的数值性能。
  • 对于行操作和利用blas的操作,如点积,它会更慢。

总的来说,极地可能更快;许多操作通常能够并行运行。如果你觉得它在某个方面太慢,那就开一个问题。

相关问题