Polars vs Pandas 速度测试:一个 Rust 重写的魔法

date
Feb 17, 2023
slug
substitute-pandas-with-polars-a-dataframe-module-rewritten-in-rust
status
Published
summary
Polars 是一个我早有耳闻但从未实际使用的 Pandas 替代品。根据 Polars 自己的介绍,它是一个“超级快的数据框”(blazingly fast DataFrames)——王婆卖瓜能信吗?本文在自己的常用环境测试了一下,确实很快。
tags
Engineering
Data Analysis
Python
type
Post
auth
Polars 是一个我早有耳闻但从未实际使用的 Pandas 替代品。根据 Polars 自己的介绍,它是一个“超级快的数据框”(blazingly fast DataFrames)——王婆卖瓜能信吗?本文在自己的常用环境测试了一下,确实很快。

测试结果

柱状图可见 Polars 常用操作所用时间均为 Pandas 的 1/4 甚至更少:
notion image
详细表格:
Task
Pandas
Polars
Import a 10mb csv file
0.157s
0.055s
Column loops
0.168s
0.060s
Concat three 10mb dataframes
0.063s
0.016s
Groupby() and sum()
0.008s
0.002s

测试方法

环境

  • Apple Silicon M1 (2020, the cheapest one)
  • MacOS 13
  • Jupyter Notebook in VSCode
  • Python ==3.10.9
  • pandas==1.5.3
  • polars==0.16.6

任务

  1. 导入一个 10MB 的 csv 文件,并指定 spe & encoding,这是很日常的任务
    1. df_pd = pd.read_csv('./data/hotel_train.txt', sep=',', encoding='utf-8') df_pl = pl.read_csv('./data/hotel_train.txt', sep=',', encoding='utf-8')
  1. 拼接重复 df 为 1 个
    1. pd.concat([df_pd, df_pd, df_pd]) pl.concat([df_pl, df_pl, df_pl])
  1. Groupby 和 sum 的简单统计操作
    1. df_pd.groupby('hotel').sum() df_pl.groupby('hotel').sum()
  1. 根据每个列名,循环进行 groupby 和 sum 的循环统计操作
    1. for col in df_pd.columns: df_pd.groupby(col).sum() for col in df_pl.columns: df_pl.groupby(col).sum()
详细测试数据和代码:https://github.com/reycn/polars-pandas-bench

参考

  1. 测试数据集:https://www.kaggle.com/datasets/jessemostipak/hotel-booking-demand
  1. 测试数据和代码:https://github.com/reycn/polars-pandas-bench
  1. 别人的大型测试:https://h2oai.github.io/db-benchmark/
  1. Polars 开源仓库:https://github.com/pola-rs/polars
 

Reynard © 2021 - 2024

Powered byVercel