pd.eval () afirma usar Numexpr, que puede acelerar las operaciones entre DataFrames
Yo personalmente experimento y muestro que la versión existente de pandas no es compatible en absoluto, y solo se aplica a la versión anterior de pandas.
Tanto la versión pandas como Numexpr son las últimas
pd.eval () admite muchas operaciones, como cuatro operaciones aritméticas, operaciones de comparación, operaciones de bits, etc.
Aquí está el primero en verificar la operación de suma en las cuatro operaciones aritméticas:
(1) Experimento de adición 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
Casi consistente
(2) Experimento de adición 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
Casi lo mismo, incluso más lento
(3) Experimento de adición 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
Casi consistente
(4) Experimento de adición 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
Casi consistente
(5) Experimento de adición 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
Experimento de multiplicación:
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
Operación de comparación:
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
Quizás ahora pandas se ha optimizado de manera muy poderosa y no hay necesidad de optimizar de esta manera.