爱上python系列------python性能(十二):pd.eval()加速实验证明无效

本文通过多个实验对比了pandas中pd.eval()方法与传统运算符在进行四则运算、乘法运算及比较运算时的性能表现。结果显示,在最新版本的pandas中,pd.eval()并未展现出明显的性能优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pd.eval()号称是使用了Numexpr,能够使用DataFrame之间的运算提速

我亲自实验,说明现有的pandas版本的根本不支持,只适用于老版本的pandas

pandas版本和Numexpr都是最新的

pd.eval()支持的运算比较多,如四则运算、比较运算、位运算等

这里首先来验证四则运算里面加法运算:

(1)加法实验1:

import numexpr
import numpy as np
import pandas  as pd

df1=pd.DataFrame([int(np.random.rand()*100) for i in range(1<<25)])
df2=pd.DataFrame([int(np.random.rand()*100) for i in range(1<<25)])

#不使用pd.eval()
%timeit df1+df2
结果:10 loops, best of 3: 144 ms per loop


#使用pd.eval()
%timeit pd.eval('df1 + df2')
结果:10 loops, best of 3: 142 ms per loop

几乎一致

(2)加法实验2:

import numexpr
import numpy as np
import pandas  as pd

df1=pd.DataFrame([int(np.random.rand()*100) for i in range(1<<20)])
df2=pd.DataFrame([int(np.random.rand()*100) for i in range(1<<20)])

#不使用pd.eval()
%timeit df1+df2
结果:100 loops, best of 3: 5.32 ms per loop


#使用pd.eval()
%timeit pd.eval('df1 + df2')
结果:100 loops, best of 3: 5.72 ms per loop

几乎一致,甚至还慢一些

(3)加法实验3:

import numexpr
import numpy as np
import pandas  as pd

df1=pd.DataFrame(np.random.rand(1000000,100))
df2=pd.DataFrame(np.random.rand(1000000,100))

#不使用pd.eval()
%timeit df1+df2
结果:1 loop, best of 3: 406 ms per loop


#使用pd.eval()
%timeit pd.eval('df1 + df2')
结果:1 loop, best of 3: 408 ms per loop

 几乎一致

(4)加法实验4:

import numexpr
import numpy as np
import pandas  as pd

df1=pd.DataFrame(np.random.rand(1000000,100))
df2=pd.DataFrame(np.random.rand(1000000,100))
df3=pd.DataFrame(np.random.rand(1000000,100))
df4=pd.DataFrame(np.random.rand(1000000,100))
df5=pd.DataFrame(np.random.rand(1000000,100))

#不使用pd.eval()
%timeit df1+df2+df3+df4+df5
结果:1 loop, best of 3: 1.67 s per loop


#使用pd.eval()
%timeit pd.eval('df1+df2+df3+df4+df5')
结果:1 loop, best of 3: 1.62 s per loop

几乎一致

(5)加法实验5:

import numexpr
import numpy as np
import pandas  as pd

df1=pd.DataFrame(np.random.rand(100000,100))
df2=pd.DataFrame(np.random.rand(100000,100))
df3=pd.DataFrame(np.random.rand(100000,100))
df4=pd.DataFrame(np.random.rand(100000,100))
df5=pd.DataFrame(np.random.rand(100000,100))

#不使用pd.eval()
%timeit df1+df2+df3+df4+df5
结果:10 loops, best of 3: 172 ms per loop


#使用pd.eval()
%timeit pd.eval('df1+df2+df3+df4+df5')
结果:10 loops, best of 3: 170 ms per loop

乘法实验:

import numexpr
import numpy as np
import pandas  as pd

df1=pd.DataFrame(np.random.rand(1000,1000))
df2=pd.DataFrame(np.random.rand(1000,1000))
df3=pd.DataFrame(np.random.rand(1000,1000))
df4=pd.DataFrame(np.random.rand(1000,1000))
df5=pd.DataFrame(np.random.rand(1000,1000))

#不使用pd.eval()
%timeit df1*df2*df3*df4*df5
结果:10 loops, best of 3: 20.1 ms per loop


#使用pd.eval()
%timeit pd.eval('df1*df2*df3*df4*df5')
结果:10 loops, best of 3: 22 ms per loop

比较运算:

import numexpr
import numpy as np
import pandas  as pd

df1=pd.DataFrame(np.random.rand(1000,1000))
df2=pd.DataFrame(np.random.rand(1000,1000))
df3=pd.DataFrame(np.random.rand(1000,1000))
df4=pd.DataFrame(np.random.rand(1000,1000))
df5=pd.DataFrame(np.random.rand(1000,1000))

#不使用pd.eval()
%timeit (df1 < df2) & (df2 <= df3) & (df3 == df4)& (df4 != df5)
结果:1 loop, best of 3: 1.94 s per loop


#使用pd.eval()
%timeit pd.eval('(df1 < df2) & (df2 <= df3) & (df3 == df4)& (df4 != df5)')
结果:1 loop, best of 3: 1.92 s per loop

也许现在的pandas已经优化得很强悍了,已经用不着这样的方式进行优化了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值