Pandas模块替代品分析

1 背景知识

本文内容主要摘自: 《Is something better than pandas when the dataset fits the memory?》
代码地址

性能对比主要围绕5个操作展开:

  1. 读取700M CSV文件:load_transactions
  2. 读取30M CSV文件:load_identity
  3. 基于某列(string格式)进行merge操作:merge
  4. 分别对六列数据进行聚合操作(sum,mean):aggregation
  5. 对merge后的数据进行排序操作:sorting

后续分析不考虑内存不足的情况:

2 Pandas VS Dask

Dask的读取优势主要由于其预加载机制导致的,可以很好地避免内存溢出的情况。除了对并行化有更好地支持外,在聚合与排序方向没有很明显的优势。

3 Pandas VS PySpark

PySpark主要为分布式计算设计,在小规模数据中并不存在明显优势

4 Pandas VS Vaex

Vaex在某些基础数据分析方面可能存在优势

5 Pandas VS Julia

Julia是一种在数据科学界颇受欢迎的编译语言,所以在首次运行代码时会进行即时编译,所以需要多次对比取平均值,同时作者也尝试了在4核处理器上的运行结果(默认是单核)。最终结果不存在明显优势,但是多核处理方面可能确实有出彩之处。

6 结论

Pandas 模块暂时还是没有足够优秀的替代品~

补充

不同读取 csv 文件方式的效率对比(Python 脚本):

Description File / Function Time (seconds)
Pure Python looping with csv module using int types pure_python_int 3.4547557830810547
Pure Python looping with csv module using float types pure_python_float 3.8738009929656982
pandas with C engine pandas_c 1.50089430809021
pandas with Python engine pandas_python 8.328583478927612
pandas with PyArrow engine and NumPy dtypes pandas_pyarrow 0.31276631355285645
pandas with PyArrow engine and PyArrow dtypes pandas_pyarrow_arrow 0.29172492027282715
Polars in lazy mode polars_lazy 0.10555672645568848
Polars in streaming mode polars_streaming 0.11504125595092773
Polars with SQL API polars_sql 0.09796714782714844
DuckDB with SQL API duckdb_sql 0.8167853355407715
DataFusion with SQL API datafusion_sql 0.20633697509765625
NumPy with loadtxt function numpy_loadtxt 1.8354885578155518
  • 从默认的 C 引擎更改为使用 PyArrow 引擎(C++ 实现的多线程 CSV 解析)可使任务速度提高 5 倍,但也会使 pandas 的安装大小增加了约 100 Mb
  • DuckDB 是一个不需要运行服务器的分析数据库(通常称为分析的 SQLite)。 Datafusion 是一个在其上构建分析数据库或数据框架库的引擎。 Polars 主要是 pandas 的替代品,但总的来说速度更快

往年同期文章