Matlab – uwaga na wydajność funkcji

Weźmy pod uwagę prosty przykład. Nasz program wymaga wielokrotnych konwersji z układu współrzędnych kartezjańskich na biegunowe.  Załóżmy, że konwersja jest dokonywana w pętli (na przykład dlatego, że każdy następny krok zależy od poprzedniego).

Matlab ma wbudowaną funkcję:

[THETA,RHO] = cart2pol(X,Y);

Do testowania wydajności przygotujemy sobie zbiór danych wejściowych:

v = randn(1000000,2)*1000;

Teraz dla każdej pary wartości (x, y) ze zmiennej v przeliczmy współrzędne:

for a = 1:length(v)
    [t r] = cart2pol(v(a,1),v(a,2));
end

Wykonanie powyższej pętli zajmuje na moim komputerze 11.692266 sekund.

Przeanalizujmy co robi funkcja cart2pol:

function [th,r,z] = cart2pol(x,y,z)
th = atan2(y,x); 
r = hypot(x,y); 
end

O ile atan2 jest operacją matematyczną, to hypot jest kolejną funkcją, która zwraca pierwiastek sumy kwadratów dwóch argumentów.

Co się zatem stanie jeśli wykonamy pętle z przykładu wyżej, ale zamiast funkcji cart2pol wywołamy obliczenia bezpośrednio?

for a = 1:length(v)
    t = atan2(v(a,2),v(a,1));
    r = sqrt(v(a,1)^2+v(a,2)^2);
end

Efekt jest identyczny. Różnica polega na tym, że czas obliczenia został zredukowany do 0.329579 sekundy, co daje przyspieszenie ponad 36 razy…

Wniosek – kod w matlabie warto analizować i optymalizować!

|

Odpowiedz