pandas性能提升之避免对小数据量使用pandas内置函数

62 篇文章 5 订阅
10 篇文章 1 订阅

       pandas本身就是面向数据分析的,而且是面向大数据分析的,所以其内置函数本身在设计上相比于一些python原生的操作就会繁杂一些,这也是为了功能性的考虑。所以,这就导致了其内置函数就像高速火车,而python的原生操作就像超跑,超跑在速度上是具有优势的,但是在功能性上是比不上高速火车的。所以,理论上,如果可以用python的原生操作实现,那么总是可以更快的,毕竟内置函数很多也是用原生操作封装好的接口而已;但是在代码的简洁性上以及重用性上就会更差,而且有时候我们自己的实现方式并不是最优的,即我们以为我们是在用超跑,其实自己造出来的只是自行车而已。

       所以,内置函数的优势在于,其功能性比较强,所以相比于超跑其起步较慢;由于直接是一个接口,可以让代码更加的简洁,重要的是,内置函数的往往也是在满足功能性的前提下,是最优的实现方式;其弱点在于,因为功能性而牺牲了性能,所以我们理论上总是可以用python的原生结构和操作更快的实现,因为当我们用原生方式实现时,实际上功能性是很单一的,所以性能也会更好,当然,内置函数的优点也就是python原生方式的缺点,因此,对于是用内置函数还是原生方式实现,需要根据不同的情形去权衡。

       pandas中,对于小数据量的操作,要尽量避免使用大部分内置函数(并非绝对,但绝对是大部分),转而使用python的轻量级的原生的操作,即用python原生的数据结构和数据之间的加减乘除等操作实现,特别是在这种情形下:对一个具有几十万行的DataFrame进行逐行的操作,这时由于每行的数据量往往较小,故不宜使用pandas内置函数,每行的一点点性能的损失经过几十万行的累加放大,就可以使得整个程序的性能显著下降。但是,如果我们是对列进行操作,这时数据量足够的大,由于函数功能性带来的性能损失是固定的,不随着数据量变化而变化,因此,这时起步的耽搁的时间相比于长途旅行来说就显得微不足道了。

       对于大数据量的操作,我们要尽量使用内置函数,因为内置函数的封装往往是相当底层的,我们用最优的原生方式实现往往比较繁琐;此外,我们要尽量使用内置函数的另一个重要的理由其实在于:pandas中的内置函数是基于numpy,而numpy底层很多是c实现的,所以相比于python原生操作在性能上具有质的提升,这相当于,高速火车变成了飞机,虽然起步还是略慢,但是中间的运行速度是远超超跑的。所以,大数据量的操作,主要时间就不是在起步上了,而是在中间的执行速度上。

       上述说明可从下面的例子中看出,对于极少的数据,原生的+优于np.sum。

import time
import pandas as pd
import numpy as np
 
df=pd.DataFrame(np.arange(800000).reshape(200000,4),columns=list('abcd'))
t1=time.time()
s1=df.apply(lambda x:x['a']+x['c']+x['b']+x['d'],axis=1)
t2=time.time()
print(t2-t1)
 
# output: 17.57075548171997

t5=time.time()
s1=df.apply(np.sum,axis=1)
t6=time.time()
print(t6-t5)
 
# output: 39.55056023597717

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值