Programador novato aquí. Estoy escribiendo un programa que analiza las ubicaciones espaciales relativas de puntos (células). El programa obtiene los límites y el tipo de celda de una matriz con la coordenada x en la columna 1, la coordenada y en la columna 2 y el tipo de celda en la columna 3. A continuación, verifica el tipo de celda y la distancia apropiada desde los límites. Si pasa, entonces calcula su distancia de cada otra celda en la matriz y si la distancia está dentro de un rango de análisis especificado, lo agrega a una matriz de salida a esa distancia.Numpy/Python con un rendimiento terrible en comparación con Matlab
Mi programa de marcado de células está en wxpython, así que esperaba desarrollar este programa también en python y eventualmente incluirlo en la GUI. Lamentablemente, en este momento, Python tarda ~ 20 segundos en ejecutar el bucle central en mi máquina, mientras que MATLAB puede hacer ~ 15 bucles/segundo. Como estoy planeando hacer 1000 bucles (con una condición de comparación aleatorizada) en ~ 30 casos por varios tipos de análisis exploratorios, esta no es una diferencia trivial.
He intentado ejecutar un generador de perfiles y las llamadas de conjunto son 1/4 de las veces, casi todo el resto es tiempo de ciclo no especificado.
Este es el código Python para el bucle principal:
for basecell in range (0, cellnumber-1):
if firstcelltype == np.array((cellrecord[basecell,2])):
xloc=np.array((cellrecord[basecell,0]))
yloc=np.array((cellrecord[basecell,1]))
xedgedist=(xbound-xloc)
yedgedist=(ybound-yloc)
if xloc>excludedist and xedgedist>excludedist and yloc>excludedist and yedgedist>excludedist:
for comparecell in range (0, cellnumber-1):
if secondcelltype==np.array((cellrecord[comparecell,2])):
xcomploc=np.array((cellrecord[comparecell,0]))
ycomploc=np.array((cellrecord[comparecell,1]))
dist=math.sqrt((xcomploc-xloc)**2+(ycomploc-yloc)**2)
dist=round(dist)
if dist>=1 and dist<=analysisdist:
arraytarget=round(dist*analysisdist/intervalnumber)
addone=np.array((spatialraw[arraytarget-1]))
addone=addone+1
targetcell=arraytarget-1
np.put(spatialraw,[targetcell,targetcell],addone)
Aquí está el código de MATLAB para el bucle principal:
for basecell = 1:cellnumber;
if firstcelltype==cellrecord(basecell,3);
xloc=cellrecord(basecell,1);
yloc=cellrecord(basecell,2);
xedgedist=(xbound-xloc);
yedgedist=(ybound-yloc);
if (xloc>excludedist) && (yloc>excludedist) && (xedgedist>excludedist) && (yedgedist>excludedist);
for comparecell = 1:cellnumber;
if secondcelltype==cellrecord(comparecell,3);
xcomploc=cellrecord(comparecell,1);
ycomploc=cellrecord(comparecell,2);
dist=sqrt((xcomploc-xloc)^2+(ycomploc-yloc)^2);
if (dist>=1) && (dist<=100.4999);
arraytarget=round(dist*analysisdist/intervalnumber);
spatialsum(1,arraytarget)=spatialsum(1,arraytarget)+1;
end
end
end
end
end
end
Gracias!
Pruebe 'xrange' en lugar de' range'. – kennytm
Eso me dio aproximadamente un 25% de mejora, gracias. – Nissl
¿Está seguro de que sus dos rutinas están dando * los mismos * resultados (es decir, que ambos están realizando el cálculo correctamente)? – gnovice