前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >polars 和 pandas 数据处理效率对比

polars 和 pandas 数据处理效率对比

作者头像
Michael阿明
发布2024-05-24 08:47:05
1100
发布2024-05-24 08:47:05
举报

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,无法充分利用多核处理器

成熟度和生态

相对较新,生态系统较小

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Polars 简介
  • 2. 测试
  • 3. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档