1. Polars 简介
Polars是一个高性能的数据处理库,它旨在提供快速的数据处理能力,特别是在处理大型数据集时。Polars是由Rust语言编写的,这使得它在性能和内存安全性方面具有显著优势。
以下是Polars的一些关键特性和优势:
- 高性能:Polars的设计重点在于优化数据处理的速度。它利用Rust语言的性能优势,提供了快速的数据过滤、分组、排序和其他常见数据操作。
- 内存效率:Polars在内存管理上进行了优化,减少了不必要的内存分配和复制,这使得它在处理大型数据集时更加高效。
- 并行处理:Polars支持并行处理,可以充分利用现代多核处理器的能力,进一步提高数据处理的速度。
- 易用性:Polars提供了类似于Pandas的API,这使得对于熟悉Pandas的用户来说,学习和迁移到Polars的成本相对较低。它支持常见的数据处理操作,如数据读取、数据清洗、数据转换等。
- 兼容性:Polars可以与Pandas无缝协作,允许用户在Pandas和Polars之间轻松转换数据。此外,它还支持多种数据格式,如CSV、Parquet等。
- 数据结构:Polars提供了DataFrame和Series这两种核心数据结构,类似于Pandas,使得数据操作直观且易于理解。
- 开源:Polars是一个开源项目,它鼓励社区参与和贡献,这意味着它不断地在进化和改进。
- 应用场景:Polars特别适合于需要处理大规模数据集的场景,尤其是在数据科学、机器学习和大数据分析等领域。
2. 测试
以下对 常用的数据分析处理库 pandas 和 polars 进行性能对比测试
- 测试环境 python3.8 pandas-2.0.3 polars-0.20.19
- 生成
1千万
行数据
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
# 将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
# 保存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
# 加载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 倍
- 过滤
# 测试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 倍
- 分组
# 测试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 倍
- 排序
# 测试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 提供了转换接口
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,无法充分利用多核处理器 |
成熟度和生态 | 相对较新,生态系统较小 | 成熟且广泛使用,生态系统丰富 |