[Turn] Comparación de la eficiencia de cinco métodos de bucle Pandas

[Eficiencia de Python] Comparación de la eficiencia de cinco métodos de bucle de Pandas

PD: Alguien mencionó una muy buena pregunta. Parece difícil implementar la vectorización si se usan operaciones más complejas en cada bucle. Mi sugerencia es dividir en operaciones de vectorización tanto como sea posible. Si no, sugiero usar numpy para escribir duro y luego use El paquete numba se acelera.

texto:

Si ha utilizado Python y Pandas, probablemente haya utilizado un bucle for para realizar algunas operaciones de análisis de datos. Desafortunadamente, las sentencias de bucle de subíndice utilizadas por la mayoría de los principiantes de Python son en realidad muy lentas y consumen mucho tiempo de ejecución incluso en pequeños conjuntos de datos. Algunos artículos anteriores en esta columna ya han involucrado esta discusión En este artículo, el hermano chino comparó más específicamente los cinco métodos diferentes de For Loop horizontalmente para dejar a todos más claros sobre la eficiencia de los diversos For Loops que normalmente escriben.

Nota: El df que aparece en el código después es un marco de datos con una sola columna llamada prueba. Además, los códigos debajo de cada método son solo ejemplos de uso y no son completamente consistentes con el código utilizado para probar la velocidad. El código de prueba original es el siguiente:

https://towardsdatascience.com/how-to-make-your-pandas-loop-71-803-times-faster-805030df4f06 haciadatascience.com

 

Método 1: ciclo de subíndice (grado de velocidad :)

df1 = df
for i in range(len(df)):
    if df.iloc[i]['test'] != 1:
        df1.iloc[i]['test'] = 0

El ciclo de subíndice consiste en recorrer una secuencia de subíndices y obtener datos continuamente a través de iloc. Este método es el más utilizado por los principiantes, pero también el más lento. En el ejemplo de prueba, se necesitan aproximadamente 21,9 segundos.

Método 2: bucle de Iterrows (grado de velocidad :)

i = 0
for ind, row in df.iterrows():
    if row['test'] != 1:
        df1.iloc[i]['test'] = 0
    i += 1

El método de bucle es recorrer sus filas, donde ind y fila representan el índice y el contenido de cada fila, respectivamente. El ejemplo de prueba toma alrededor de 0.07s, que es 321 veces más rápido que la velocidad del ciclo del subíndice.

Método 3: Aplicar ciclo (nivel de velocidad :)

df1['test'] = df['test'].apply(lambda x: x if x == 1 else 0)

Aplicar es una función de uso común de los pandas. El uso habitual es incorporar una función anónima lambda, de modo que cada fila del marco de datos se procese en un bucle. En el ejemplo de prueba, la velocidad de aplicación es 0.027s, que es 811 veces más rápida que el ciclo de subíndice.

Método 4: función de vectorización incorporada de Pandas (grado de velocidad :)

res = df.sum()

Pandas nos proporciona una gran cantidad de funciones de vectorización integradas, como suma, media que puede calcular rápidamente la suma y el promedio de una columna. En el ejemplo de prueba, la velocidad es 0.00236s, que es 9280 veces más rápida que el ciclo de subíndice.

Método 5: función de vectorización Numpy (grado de velocidad :)

df_values = df.values
res = np.sum(df_values)

El último método es convertir los datos de Pandas en Numpy Array y luego usar las funciones integradas de Numpy para la vectorización. En el ejemplo de prueba, la velocidad es 0,000305s, que es 71800 veces más rápida que el ciclo de subíndice.

La siguiente es una tabla de comparación de velocidad detallada, del enlace anterior:

Fuentes:

[1]  https://stackoverflow.com/questions/52673285/performance-of-pandas-apply-vs-np-vectorize-to-create-new-column-from-existing-c
[2]  https: // es .wikipedia.org / wiki / Locality_of_reference

 

Supongo que te gusta

Origin blog.csdn.net/weixin_52071682/article/details/115148961
Recomendado
Clasificación