Python pandas 效率到底如何?

pandas是基于numpy数组来计算的,本身有优势,处理小批量数据集(百万行以下,1GB以内)效率是完全可以接受的,相比其他的数据处理库其实差异不大,因为1GB以内的容量对电脑内存的占用并不大,且单核处理起来也不吃力,这时候Pandas的速度和便捷性综合优势能发挥到最大。

但如果超出1GB的数据,由于计算资源吃紧和内存过载的关系,pandas就会显得心有余而力不足,一些复杂的数据处理操作会很消耗时间,比如groupby、apply等。

如何优化Pandas的速度呢?首先得知道pandas的哪些骚操作会让它变慢。

首当其冲的就是逐行循环操作,比如apply方法,是对每一行执行函数操作,这会促发触发 Python 解释器开销,速度非常的慢。

比如你对每一行执行多字段判断操作,比如math > 90, english > 90 则返回“优秀”,使用apply方法哪怕每一行只消耗0.0001秒,那处理一千万行的数据也需要17分钟,这是觉得没法忍受的。

如果你真的需要对每一行做处理,可以用numpy向量化来实现,可以用np.select(多分支条件)​来实现,会比apply方法快上百倍以上,因为numpy是批量处理的。

import numpy as np  
# numpy向量化处理
condition = (df['math'] > 90) & (df['english'] > 90) 
df['result_np_where'] = np.where(condition, "优秀", "一般")

另外导致pandas变慢的还有它的数据类型,因为pandas默认使用高精度类型,这就导致无效内存占用过高,比如int64会比int8多8倍的内存。

对于精度要求不高的数据,你可以在加载数据的时候,去调整下数据类型,把高精度调整为合适的低精度,比如年龄字段int8精度就够了,没必要int32或者int64。

# 指定数据类型
dtype_opt = {'id': 'int32', 'age': 'int8', 'price': 'float32'}
df = pd.read_csv('data.csv', dtype=dtype_opt)  

还有重复的字符串不需要都用object类型,比如省份名称,可以用category类型,这样占用的内存会降低。

df['province'] = df['province'].astype('category') 

在读取数据文件的时候,很多人默认全部读取到内存,这对于几十M的小文件来说没什么,但如果是几GB的大文件,则会很快占满内存,导致数据处理变慢。

所以可以用pandas自带的分块加载(chunksize)的方式,将大文件分为n个小文件,分批去读取并处理,这样可以把几GB的大文件拆解成N个几十M的小文件,pandas处理起来就毫无压力。

chunk_size = 50000  # 每次读取5万行
results = []
for chunk in pd.read_csv('huge_file.csv', chunksize=chunk_size):
    chunk = chunk[chunk['value'] > 0]  # 过滤处理
    results.append(chunk.groupby('category').sum())
final_result = pd.concat(results).groupby(level=0).sum()  # 合并结果

当然以上的优化方法也只使用pandas处理中小规模的数据,对于大数据集尽管优化后速度提升也不会明显。

大数据集有大数据集的处理手段,有不少类pandas的替代加速库可以使用,比如polars、dash、modin、cudf等,它们采用并行计算、分布式或者硬件加速的方式来加快数据处理速度。

而且它们大多是用pandas的接口,函数、方法和pandas类似,切换的学习成本很低,比如PolarsModincuDF

那什么场景下使用对应的数据处理库呢?就像之前说的,小数据集或者快速验证的数据可以用pandas,单机处理中大数据集用Polars或Modin,分布式处理超大数据集用Dask,有GPU加速用cuDF,复杂查询则用DuckDB

总的来说,Pandas则绝大多数场景下速度已经够用了,而且它的生态和功能是最完善的,其他加速库尽管速度上有优势,但体系能力还是差不少的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱卫军 AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值