Python – Cálculo de iteración sobre iteración
Buenos días.
Tengo una base de datos con casi 1.3 millones de filas (Base de Datos de Cráteres Lunares) y quiero agrupar los cráteres que están dentro de cráteres más grandes. Para hacer esto, ordené la base de datos de mayor a menor y luego iteré los cráteres más grandes sobre los demás para calcular si la distancia entre las posiciones está dentro del diámetro. El problema es que este cálculo lleva aproximadamente 50 segundos por cráter, por lo que llevará varios meses calcular toda la base de datos. He probado algunas técnicas alternativas como Dask, Multiprocessing, pero no funcionaron. Agradezco cualquier ayuda que puedan brindarme.
start = datetime.now()
cluster = 1
for i in range(len(craters_diam)):
start2 = datetime.now()
if craters_diam.loc[i, 'CLUSTER'] == 0:
craters_diam.loc[i, 'CLUSTER'] = cluster
lat1 = craters_diam.loc[i, 'LAT_CIRC_IMG']
lon1 = craters_diam.loc[i, 'LON_CIRC_IMG']
diam = craters_diam.loc[i, 'DIAM_CIRC_IMG']
for j in range(i+1, len(craters_diam)):
if craters_diam.loc[j, 'CLUSTER'] == 0:
lat2 = craters_diam.loc[j, 'LAT_CIRC_IMG']
lon2 = craters_diam.loc[j, 'LON_CIRC_IMG']
dist = distance(lat1, lat2, lon1, lon2)
if dist <= diam/2:
craters_diam.loc[j, 'CLUSTER'] = cluster
cluster += 1
print(datetime.now() - start2)
print(datetime.now() - start)
La función de distancia calcula en geometría esférica.
Si alguien conoce una manera más inteligente (más rápida) de hacerlo, ¡gracias!
davy.ai
Hola,
Parece que el enfoque actual que estás utilizando es muy consumidor de tiempo y puede tardar meses en agrupar todos los cráteres. Aquí tienes algunas sugerencias que pueden ayudarte a mejorar la velocidad del proceso:
Paraleliza la tarea: Si bien has intentado la multiprocesamiento, puede haber algunos problemas con la implementación que deben abordarse. Si puedes paralelizar la tarea de manera eficiente, esto puede acelerar significativamente el proceso.
Reduce el número de comparaciones: Puedes reducir la cantidad de comparaciones que necesitas hacer utilizando indexación espacial. Por ejemplo, el índice R-tree puede almacenar las posiciones y diámetros de los cráteres de manera que se limite el número de comparaciones necesarias para encontrar cráteres cercanos. Esta técnica puede reducir en gran medida el tiempo necesario para las comparaciones.
Utiliza Cython o Numba: Realizar un perfilado de tu código te dirá qué secciones son las más lentas. Puedes utilizar Cython o Numba para optimizar esas secciones lentas. Estas herramientas escriben código C o de máquina de alto rendimiento para tus funciones de Python y pueden mejorar significativamente el rendimiento.
Espero que estas sugerencias te ayuden a encontrar un enfoque más rápido para tu problema. ¡Buena suerte!