es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pandas: ¿Cómo maximizar la eficiencia en la búsqueda “isin” en un DataFrame grande?

Tengo un df que consiste en millones de filas. Necesito ejecutar un procedimiento recursivo que básicamente se repite hasta que una condición se agote.


<h1>El índice del df se establece en la columna de búsqueda, esto ayuda mucho, ordenar en realidad afecta el rendimiento (¿sorprendentemente?)</h1> df = df.set_index('columna_de_búsqueda') <h1>La función de búsqueda; extraer algunas columnas de interés</h1> df[df.index.isin(ids_a_buscar)][['val1', 'val2']].to_numpy()

La recursión ocurre porque necesito encontrar todos los ID hijos asociados con un único ID padre. El proceso es el siguiente:

  1. Cargar el ID del padre único
  2. Buscar los ID de sus hijos
  3. Utilizar los ID de los hijos obtenidos en el paso 2 como nuevos ID de padres
  4. Buscar los ID de sus hijos
  5. Repetir los pasos 3 y 4 hasta que no se encuentren más ID de hijos

Lo mencionado anteriormente no es malo, pero con miles de cosas que verificar, n veces con recursión, es un proceso lento al final del día.

“ids_a_buscar” consiste en una lista de cadenas aleatorias de longitud 32, a veces involucrando docenas o cientos de cadenas que verificar.

¿Qué otros trucos podría intentar utilizar?

Editar: Otros intentos

Otros intentos que he realizado y que no funcionaron mejor son:

  1. Usar “modin”, aprovechando el motor Dask
  2. Swifter + “modin”, aprovechando el motor Dask
  3. Cambiar “isin” de pandas (y convertir el dataframe completamente a numpy también) con “np.in1d” de numpy, en última instancia para usar JIT/Numba, pero no pude hacer que funcionara.
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución potencial para optimizar este procedimiento recursivo sería implementar cómputo paralelo. Esto implicaría dividir la tarea en subtareas más pequeñas y asignarlas a diferentes procesadores para ser ejecutadas simultáneamente. Esto se puede hacer utilizando bibliotecas como Dask o multiprocessing en Python. Otra solución sería utilizar caché para almacenar los resultados de las búsquedas ya realizadas, de modo que puedan ser reutilizados en búsquedas posteriores sin tener que repetir las mismas operaciones. Esto se puede implementar utilizando herramientas como Redis o Memcached. Además, optimizar el propio código y eliminar operaciones innecesarias como clasificaciones también podría mejorar el rendimiento. Por último, aumentar el hardware utilizado para realizar el procedimiento, como incrementar el número de CPUs o utilizar un servidor más potente, también podría ayudar a acelerar el proceso.

Comments are closed.