导语 polars 是一个使用 apache arrow 列格式作为内存模型,用rust实现的,在rust, python以及node.js中均可使用的速度极快的数据帧库。
它有以下几个特点:
懒|立即执行
多线程
simd
查询优化
强大的表达式api
支持多种语言:rust、python 等
了解更多内容可以点击这个用户指南[1]。
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基准测试结果[2]。
此处我们自己用一些示例代码来对比python中pandas和polars处理数据的速度差距。
import pandas as pdimport polars as plimport timeit# 读取时间对比start_df = timeit.default_timer()df = pd.read_csv(/users/lenskit/desktop/aa.csv)df = df.sort_values(company_name, ascending=false).head()stop_df = timeit.default_timer()print('time: ', stop_df - start_df)start_pl = timeit.default_timer()data = pl.read_csv(/users/lenskit/desktop/aa.csv)data.sort(by=company_name, reverse=true).head()stop_pl = timeit.default_timer()print('time1: ', stop_pl - start_pl)# 纵向拼接时间对比start_df1 = timeit.default_timer()df_1 = pd.read_csv('/users/lenskit/desktop/aa.csv')df_2 = pd.read_csv('/users/lenskit/desktop/bb.csv')df_1.append(df_2, ignore_index=true)stop_df1 = timeit.default_timer()print('time2: ', stop_df1 - start_df1)start_pl1 = timeit.default_timer()pl_1 = pl.read_csv('/users/lenskit/desktop/aa.csv')pl_2 = pl.read_csv('/users/lenskit/desktop/bb.csv')pl_1.vstack(pl_2)stop_pl1 = timeit.default_timer()print('time3: ', stop_pl1 - start_pl1)time: 5.088931238time1: 0.8967700230000002time2: 4.707102063time3: 0.639797883 可以看到在读取文件上,polars比pandas速度快了5倍多,在数据纵向拼接上,polars比pandas快了有7倍多。
python安装 用如下语句安装最新的polars版本:
$ pip3 install -u polars[pyarrow] 目前polars的更新频率很高(每周/每隔几天),所以最好定期更新一下polars来获得最新的错误修复/功能。
rust安装 您可以从crates.io获取最新版本,或者如果你想使用最新的功能/性能改进,可以用如下命令指向版本的master分支。
polars = { git = https://github.com/pola-rs/polars, rev = } 注意需要rust version >=1.58
文档 想知道polars支持的所有功能吗?阅读文档!
python
安装指南:$ pip3 install polars
python文档[3]
用户指南[4]
rust
rust文件(主分支)[5]
用户指南[6]
node
安装指南:yarn install nodejs-polars
node文档[7]
用户指南[8]
[python]: 从源代码编译polars 如果你想要获取最前沿的版本或最大的性能,你应该从源代码编译polar。
这可以通过按顺序执行以下步骤来完成:
1、安装最新的rust编译器[9]
2、安装maturin[10]: $ pip3 install maturin
3、选择以下任一:
最快的二进制文件,非常长的编译时间:
$ 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[11]。arrow2是apache arrow columnar format[12]更快、更安全的实现。arrow2还具有更细粒度的代码库,有助于减少编译器膨胀。
关于盐雾腐蚀试验箱的相关性能介绍
线上剁手就算了!现在线下也要剁手了!马云的无人超市正式开张,拿了东西就走!
浅谈SAAS-SRM系统助力企业信息化管理
关于工控主板接口,HDMI接口与VGA接口有什么区别?
电阻柜如何保障能正常运行
Pandas数据帧库概述、性能及安装
致钛最强固态表现怎么样,PC005 Active的体验如何
C波段宽带低噪声放大器的研究及设计
刚刚!国家发改委发文:将鼓励这些传感器发展!(附全名单)
AuthenTec团队正在研究全新的屏下指纹识别技术
Maxim发布新一代多协议收发器芯片组
东风公司L4级5G自动驾驶汽车量产下线
智能镜子显示屏它将成为开启黑科技生活的第一步
陷入风波的先进工艺
2000万超清双摄专业人像模式,OPPOR11再度升级吸引眼球
谁说华为p10拍照最强大,OPPOR9s你确定用过?
无外部高速时钟时HSE_RDY被意外置位问题
使用obd接口有何风险
使用VPLC控制器进行图像拼接的实例
实时频谱分析仪中如何选择合适的FFT窗函数