Programmatore novizio qui. Sto scrivendo un programma che analizza le posizioni spaziali relative dei punti (cellule). Il programma ottiene i confini e il tipo di cella da una matrice con la coordinata x nella colonna 1, la coordinata y nella colonna 2 e il tipo di cella nella colonna 3. Quindi controlla ogni cella per il tipo di cella e la distanza appropriata dai limiti. Se passa, calcola la distanza tra le celle della matrice e se la distanza si trova all'interno di un intervallo di analisi specificato, la aggiunge a una matrice di output a quella distanza.Numpy/Python prestazioni terribilmente vs. Matlab
Il mio programma di marcatura celle è in wxpython, quindi speravo di sviluppare questo programma anche in python ed eventualmente inserirlo nella GUI. Sfortunatamente in questo momento python impiega circa 20 secondi per eseguire il core loop sulla mia macchina mentre MATLAB può fare ~ 15 loop/secondo. Dato che sto pianificando di fare 1000 loop (con una condizione di confronto randomizzato) su ~ 30 casi volte diversi tipi di analisi esplorative questa non è una differenza banale.
Ho provato a eseguire un profiler e le chiamate di array sono 1/4 del tempo, quasi tutto il resto è un loop non specificato.
ecco il codice Python per il ciclo principale:
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)
Ecco il codice MATLAB per il ciclo principale:
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
Grazie!
Prova 'xrange' invece di' range'. – kennytm
Questo mi ha dato un miglioramento di circa il 25%, grazie. – Nissl
Sei sicuro che le tue due routine stanno dando * gli stessi * risultati (cioè che stanno entrambi eseguendo il calcolo correttamente)? – gnovice