黄东旭解析 TiDB 的核心优势
867
2023-06-10
6.6K Star!比 Pandas 快很多的数据处理库
导语
Polars 是一个使用 Apache Arrow 列格式作为内存模型,用Rust实现的,在Rust, Python以及Node.js中均可使用的速度极快的数据帧库。
它有以下几个特点:
懒|立即执行多线程SIMD查询优化强大的表达式API支持多种语言:Rust、Python 等
Python代码示例
>>> df = pl.DataFrame(... {... "A": [1, 2, 3, 4, 5],... "fruits": ["banana", "banana", "apple", "apple", "banana"],... "B": [5, 4, 3, 2, 1],... "cars": ["beetle", "audi", "beetle", "beetle", "beetle"],... }... )# embarrassingly parallel execution# very expressive query language>>> (... df... .sort("fruits")... .select(... [... "fruits",... "cars",... pl.lit("fruits").alias("literal_string_fruits"),... pl.col("B").filter(pl.col("cars") == "beetle").sum(),... pl.col("A").filter(pl.col("B") > 2).sum().over("cars").alias("sum_A_by_cars"), # groups by "cars"... pl.col("A").sum().over("fruits").alias("sum_A_by_fruits"), # groups by "fruits"... pl.col("A").reverse().over("fruits").alias("rev_A_by_fruits"), # groups by "fruits... pl.col("A").sort_by("B").over("fruits").alias("sort_A_by_B_by_fruits"), # groups by "fruits"... ]... )... )shape: (5, 8)┌──────────┬──────────┬──────────────┬─────┬─────────────┬─────────────┬─────────────┬─────────────┐│ fruits ┆ cars ┆ literal_stri ┆ B ┆ sum_A_by_ca ┆ sum_A_by_fr ┆ rev_A_by_fr ┆ sort_A_by_B ││ --- ┆ --- ┆ ng_fruits ┆ --- ┆ rs ┆ uits ┆ uits ┆ _by_fruits ││ str ┆ str ┆ --- ┆ i64 ┆ --- ┆ --- ┆ --- ┆ --- ││ ┆ ┆ str ┆ ┆ i64 ┆ i64 ┆ i64 ┆ i64 │╞══════════╪══════════╪══════════════╪═════╪═════════════╪═════════════╪═════════════╪═════════════╡│ "apple" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 7 ┆ 4 ┆ 4 │├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤│ "apple" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 7 ┆ 3 ┆ 3 │├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤│ "banana" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 8 ┆ 5 ┆ 5 │├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤│ "banana" ┆ "audi" ┆ "fruits" ┆ 11 ┆ 2 ┆ 8 ┆ 2 ┆ 2 │├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤│ "banana" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 8 ┆ 1 ┆ 1 │└──────────┴──────────┴──────────────┴─────┴─────────────┴─────────────┴─────────────┴─────────────┘
性能
Polars速度非常快,事实上,它是目前性能最好的解决方案之一。具体可参见 h2oai's db基准测试结果 。
此处我们自己用一些示例代码来对比python中pandas和polars处理数据的速度差距。
可以看到在读取文件上,polars比pandas速度快了5倍多,在数据纵向拼接上,polars比pandas快了有7倍多。
Python安装
用如下语句安装最新的polars版本:
$ pip3 install -U polars[pyarrow]
目前polars的更新频率很高(每周/每隔几天),所以最好定期更新一下polars来获得最新的错误修复/功能。
Rust安装
注意需要Rust version >=1.58
文档
想知道Polars支持的所有功能吗?阅读文档!
Python
Rust
Node
[Python]: 从源代码编译polars
如果你想要获取最前沿的版本或最大的性能,你应该从源代码编译Polar。
这可以通过按顺序执行以下步骤来完成:
1、安装最新的 Rust编译器2、安装 maturin :$ pip3 install maturin3、选择以下任一:最快的二进制文件,非常长的编译时间:$ cd py-polars && maturin develop --rustc-extra-args="-C target-cpu=native" --release较快的二进制文件,短一些的编译时间:$ cd py-polars && maturin develop --rustc-extra-args="-C codegen-units=16 -C lto=
需要注意的是,Python实现的Rust crate被称为 py-polars ,以区别于Rust crate包 polars 本身。然而,Python包和Python模块都被命名为 polars ,所以你可以 pip install polars 和 import polars 。
Arrow2
Polars已经转移到 arrow2 。Arrow2是 Apache Arrow Columnar Format 更快、更安全的实现。Arrow2还具有更细粒度的代码库,有助于减少编译器膨胀。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。