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

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已经优化得很强悍了,已经用不着这样的方式进行优化了

猜你喜欢

转载自blog.csdn.net/zhou_438/article/details/109317449