Numpy / Python ужасно работает по сравнению с Matlab

Здесь начинающий программист. Я' m написать программу, которая анализирует относительное пространственное расположение точек (ячеек). Программа получает границы и тип ячейки из массива с координатой x в столбце 1, координатой y в столбце 2 и типом ячейки в столбце 3. Затем она проверяет каждую ячейку на предмет типа ячейки и соответствующего расстояния от границ. Если он проходит, он затем вычисляет свое расстояние от каждой другой ячейки в массиве, и если расстояние находится в пределах указанного диапазона анализа, он добавляет его в выходной массив на этом расстоянии.

Моя программа маркировки ячеек находится в wxpython, поэтому я был в надежде разработать эту программу также на Python и в конечном итоге вставить ее в графический интерфейс. К сожалению, сейчас python требуется ~ 20 секунд для запуска основного цикла на моей машине, в то время как MATLAB может выполнять ~ 15 циклов в секунду. Так как я' м планируя выполнить 1000 циклов (с условием рандомизированного сравнения) в ~ 30 случаях, умноженных на несколько типов исследовательского анализа, это нетривиальная разница.

Я пробовал запустить профилировщик, и вызовы массивов выполняются в 1/4 случаев, почти все остальное - это неопределенное время цикла.

Вот код python для основного цикла:

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)

Вот код matlab для основного цикла:

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

Спасибо!

8
задан zellus 18 November 2010 в 19:54
поделиться