Enamórate de la serie python ------ rendimiento de python (12): el experimento acelerado pd.eval () resultó inválido

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.

Supongo que te gusta

Origin blog.csdn.net/zhou_438/article/details/109317449
Recomendado
Clasificación