polars 和 pandas 数据处理效率对比

2024-05-24 08:47:05 浏览数 (2)

1. Polars 简介

Polars是一个高性能的数据处理库,它旨在提供快速的数据处理能力,特别是在处理大型数据集时。Polars是由Rust语言编写的,这使得它在性能和内存安全性方面具有显著优势。

以下是Polars的一些关键特性和优势:

  1. 高性能:Polars的设计重点在于优化数据处理的速度。它利用Rust语言的性能优势,提供了快速的数据过滤、分组、排序和其他常见数据操作。
  2. 内存效率:Polars在内存管理上进行了优化,减少了不必要的内存分配和复制,这使得它在处理大型数据集时更加高效。
  3. 并行处理:Polars支持并行处理,可以充分利用现代多核处理器的能力,进一步提高数据处理的速度。
  4. 易用性:Polars提供了类似于Pandas的API,这使得对于熟悉Pandas的用户来说,学习和迁移到Polars的成本相对较低。它支持常见的数据处理操作,如数据读取、数据清洗、数据转换等。
  5. 兼容性:Polars可以与Pandas无缝协作,允许用户在Pandas和Polars之间轻松转换数据。此外,它还支持多种数据格式,如CSV、Parquet等。
  6. 数据结构:Polars提供了DataFrame和Series这两种核心数据结构,类似于Pandas,使得数据操作直观且易于理解。
  7. 开源:Polars是一个开源项目,它鼓励社区参与和贡献,这意味着它不断地在进化和改进。
  8. 应用场景:Polars特别适合于需要处理大规模数据集的场景,尤其是在数据科学、机器学习和大数据分析等领域。

2. 测试

以下对 常用的数据分析处理库 pandas 和 polars 进行性能对比测试

  • 测试环境 python3.8 pandas-2.0.3 polars-0.20.19
  • 生成 1千万行数据
代码语言:javascript复制
import numpy as np
import pandas as pd
import polars as pl
import time

# 设置随机种子以获得可重复的结果
np.random.seed(0)

# 生成大数据集
data_size = 10000000  # 例如,10 million rows
columns = ['col1', 'col2', 'col3', 'col4', 'col5']
data = np.random.rand(data_size, len(columns))  # 生成随机数据
  • 生成 DataFrame
代码语言:javascript复制
# 将numpy数组转换为pandas DataFrame和polars DataFrame
start_time = time.time()
df_pandas = pd.DataFrame(data, columns=columns)
print(f"pands DataFrame took: {time.time() - start_time:.2f} seconds")

start_time = time.time()
df_polars = pl.DataFrame(data, columns)
print(f"polars DataFrame took: {time.time() - start_time:.2f} seconds")

输出:

代码语言:javascript复制
pands DataFrame took: 0.00 seconds
polars DataFrame took: 0.64 seconds
  • 保存 csv
代码语言:javascript复制
# 保存DataFrame为CSV文件
start_time = time.time()
df_pandas.to_csv('pandas_data.csv', index=False)
print(f"Saving pandas DataFrame to CSV took: {time.time() - start_time:.2f} seconds")

start_time = time.time()
df_polars.write_csv('polars_data.csv')
print(f"Saving polars DataFrame to CSV took: {time.time() - start_time:.2f} seconds")

输出:

代码语言:javascript复制
Saving pandas DataFrame to CSV took: 116.20 seconds
Saving polars DataFrame to CSV took: 9.09 seconds

polars 的效率是 pandas 的 12.7

  • 读取 csv
代码语言:javascript复制
# 加载csv文件
start_time = time.time()
df_pandas = pd.read_csv('pandas_data.csv')
end_time = time.time()
print(f"Loading pandas DataFrame from CSV took: {end_time - start_time:.2f} seconds")

start_time = time.time()
df_polars = pl.read_csv('polars_data.csv')
end_time = time.time()
print(f"Loading polars DataFrame from CSV took: {end_time - start_time:.2f} seconds")

输出:

代码语言:javascript复制
Loading pandas DataFrame from CSV took: 10.06 seconds
Loading polars DataFrame from CSV took: 0.95 seconds

polars 的效率是 pandas 的 10.5

  • 过滤
代码语言:javascript复制
# 测试pandas的数据过滤性能
start_time = time.time()
df_filtered_pandas = df_pandas[df_pandas['col1'] > 0.5]
end_time = time.time()
print(f"Pandas data filtering took: {end_time - start_time:.2f} seconds")

# 测试polars的数据过滤性能
start_time = time.time()
df_filtered_polars = df_polars.filter(df_polars['col1'] > 0.5)
end_time = time.time()
print(f"Polars data filtering took: {end_time - start_time:.2f} seconds")

输出:

代码语言:javascript复制
Pandas data filtering took: 0.42 seconds
Polars data filtering took: 0.23 seconds

polars 的效率是 pandas 的 1.8

  • 分组
代码语言:javascript复制
# 测试pandas的数据分组性能
start_time = time.time()
grouped_pandas = df_pandas.groupby('col1').agg(np.mean)
end_time = time.time()
print(f"Pandas data grouping took: {end_time - start_time:.2f} seconds")

# 测试polars的数据分组性能
start_time = time.time()
grouped_polars = df_polars.group_by('col1').agg(
    col1_mean = pl.col('col1').mean()
)
end_time = time.time()
print(f"Polars data grouping took: {end_time - start_time:.2f} seconds")

输出:

代码语言:javascript复制
Pandas data grouping took: 20.08 seconds
Polars data grouping took: 1.92 seconds

polars 的效率是 pandas 的 10.4

  • 排序
代码语言:javascript复制
# 测试pandas的数据排序性能
start_time = time.time()
sorted_pandas = df_pandas.sort_values(by='col1')
end_time = time.time()
print(f"Pandas data sorting took: {end_time - start_time:.2f} seconds")

# 测试polars的数据排序性能
start_time = time.time()
sorted_polars = df_polars.sort('col1')
end_time = time.time()
print(f"Polars data sorting took: {end_time - start_time:.2f} seconds")

输出:

代码语言:javascript复制
Pandas data sorting took: 7.59 seconds
Polars data sorting took: 1.17 seconds

polars 的效率是 pandas 的 6.5

  • polars dataframe 转换成 pandas dataframe 由于 Scikit-learn 等库还不支持 polars dataframe,但是支持 pandas,polars 提供了转换接口
代码语言:javascript复制
start_time = time.time()
df_pandas = df_polars.to_pandas()
end_time = time.time()
print(f"Polars to pandas conversion took: {end_time - start_time:.2f} seconds")

输出:Polars to pandas conversion took: 0.36 seconds

3. 总结

特点

Polars

Pandas

性能优化

使用 Rust 编写底层,高性能

基于 Python 和 C,性能相对较低

并行处理

支持并行执行操作

受限于 Python 的 GIL,无法充分利用多核处理器

成熟度和生态

相对较新,生态系统较小

成熟且广泛使用,生态系统丰富

0 人点赞