Saltar al contenido

¿Hay alguna diferencia de rendimiento entre Numpy y Pandas?

Solución:

Puede haber una diferencia de rendimiento significativa, de un orden de magnitud para las multiplicaciones y múltiples órdenes de magnitud para indexar algunos valores aleatorios.

De hecho, me estaba preguntando lo mismo y encontré esta interesante comparación: http://penandpants.com/2014/09/05/performance-of-pandas-series-vs-numpy-arrays/

Creo que se trata más de usar los dos estratégicamente y cambiar los datos (de numpy a pandas o viceversa) en función del rendimiento que ves. Como ejemplo reciente, estaba tratando de concatenar 4 pequeños archivos pickle con 10k filas cada uno data.shape -> (10,000, 4) usando numpy.

El código era algo como:

n_concat = np.empty((0,4))
for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(file_path)
    n_concat = np.vstack((co_np, filtered_snp))
joblib.dump(co_np, 'data/save_file.pkl', compress = True)

Esto estrelló mi computadora portátil (8 GB, i5), lo cual fue sorprendente ya que el volumen no era realmente ese enorme. Los 4 archivos en escabeche comprimidos tenían aproximadamente 5 MB cada uno.

Lo mismo, funcionó muy bien con los pandas.

for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(sd)
    try:
        df = pd.concat([df, pd.DataFrame(n_data, columns = [...])])
    except NameError:
        df = pd.concat([pd.DataFrame(n_data,columns = [...])])
joblib.dump(df, 'data/save_file.pkl', compress = True)

Por otro lado, cuando estaba implementando el descenso de gradiente iterando sobre un marco de datos de pandas, era terriblemente lento, mientras que usar numpy para el trabajo era mucho más rápido.

En general, he visto que los pandas generalmente funcionan mejor para moverse / mover trozos de datos moderadamente grandes y realizar operaciones de columna comunes, mientras que numpy funciona mejor para trabajo vectorizado y recursivo (tal vez trabajo más matemático intenso) sobre conjuntos de datos más pequeños.

Mover datos entre los dos no tiene problemas, así que supongo que usar ambos estratégicamente es el camino a seguir.

En mis experimentos con grandes datos numéricos, Pandas es consistentemente 20 VECES MÁS LENTO que Numpy. Esta es una gran diferencia, dado que solo se realizaron operaciones aritméticas simples: corte de una columna, mean (), searchsorted () – ver más abajo. Inicialmente, pensé que Pandas se basaba en numpy, o al menos su implementación estaba optimizada en C como la de numpy. Sin embargo, estas suposiciones resultan ser falsas, dada la enorme brecha de desempeño.

En los ejemplos siguientes, data es un marco de pandas con 8M filas y 3 columnas (int32, float32, float32), sin valores NaN, la columna # 0 (tiempo) está ordenada. data_np fue creado como data.values.astype('float32'). Resultados en Python 3.8, Ubuntu:

A. Cortes de columna y media ():

# Pandas 
%%timeit 
x = data.x 
for k in range(100): x[100000:100001+k*100].mean() 

15.8 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# Numpy
%%timeit 
for k in range(100): data_np[100000:100001+k*100,1].mean() 

874 µs ± 4.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Pandas es 18 veces más lento que Numpy (15,8 ms frente a 0,874 ms).

B. Buscar en una columna ordenada:

# Pandas
%timeit data.time.searchsorted(1492474643)                                                                                                                                                               
20.4 µs ± 920 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

# Numpy
%timeit data_np[0].searchsorted(1492474643)                                                                                                                                                              
1.03 µs ± 3.55 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Pandas es 20 veces más lento que Numpy (20,4 µs frente a 1,03 µs).

EDITAR: Implementé una clase namedarray que cierra la brecha entre Pandas y Numpy porque se basa en la clase ndarray de Numpy y, por lo tanto, funciona mejor que Pandas (generalmente ~ 7 veces más rápido) y es totalmente compatible con la API de Numpy’a y todos sus operadores; pero al mismo tiempo mantiene nombres de columna similares al DataFrame de Pandas, por lo que la manipulación en columnas individuales es más fácil. Esta es una implementación de prototipo. A diferencia de los pandas, nombredarray lo hace no permitir diferentes tipos de datos para las columnas. El código se puede encontrar aquí: https://github.com/mwojnars/nifty/blob/master/math.py (busque “namedarray”).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *