Programmeur novice ici. J'écris un programme qui analyse les emplacements spatiaux relatifs des points (cellules). Le programme obtient les limites et le type de cellule d'un tableau avec la coordonnée x dans la colonne 1, la coordonnée y dans la colonne 2 et le type de cellule dans la colonne 3. Il vérifie ensuite chaque cellule pour le type de cellule et la distance appropriée des limites. S'il passe, il calcule ensuite sa distance à partir de chaque cellule du tableau et si la distance est dans une plage d'analyse spécifiée, il l'ajoute à un tableau de sortie à cette distance. Mon programme de marquage de cellules est en wxpython. J'espérais donc développer ce programme en python et le coller dans l'interface graphique. Malheureusement en ce moment python prend ~ 20 secondes pour exécuter la boucle de base sur ma machine tandis que MATLAB peut faire ~ 15 boucles/seconde. Puisque je prévois de faire 1000 boucles (avec une condition de comparaison aléatoire) sur ~ 30 cas fois plusieurs types d'analyse exploratoire, ce n'est pas une différence triviale.Numpy/Python performant terriblement vs Matlab
J'ai essayé d'exécuter un profileur et les appels de groupe sont 1/4 du temps, presque tout le reste est temps de boucle non spécifié.
Voici le code python pour la boucle 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)
Voici le code Matlab pour la boucle 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
Merci!
Essayez 'xrange' au lieu de' range'. – kennytm
Cela m'a donné environ 25% d'amélioration, merci. – Nissl
Etes-vous certain que vos deux routines donnent les mêmes résultats (c'est-à-dire qu'elles effectuent correctement le calcul)? – gnovice