MATLAB'de neden döngülerden kaçınmalıyız ve ilklendirme yapmalıyız?
Bildiğimiz üzere, MATLAB, yorumlayıcı (interpreter) diller sınıfına ait. Yavaşlığa neden olan bu altyapı yüzünden MATLAB kullanırken döngülerden kaçınmamız tembihlenir. Peki biz bu tembihlere denemeden inanır mıyız? Cevabı aldım, evet, inanmayız!
Bir e-deney (bunu yeni uydurdum, bilgisayarcının deneyi böyle olur) tasarlayalım. Döngü kullanmanın ve ilklendirme yapmanın, yani MATLAB diliyle konuşursak, for
kullanmanın ve zeros
ile değişken için yer açmanın etkisini merak ediyoruz. Bunun için şu üç farklı yöntemi test edeceğiz:
- Döngülü ve ilklendirmesiz
- Döngülü ve ilklendirmeli
- Vektörleştirme (vectorization)
Deneyleri bir kere yapmaktansa çok kere tekrarlayıp ortalamasını almak bizim gibi titiz e-deneyciye daha çok yakışır. Bunları gözönünde tutarak elemanlar üstünde $y = x^2-4x+3$ polinomunu hesaplayan şöyle bir kod yazalım:
clc, clear n = 1000000; x = 1:n; deneySayisi = 100; %% Döngülü ve ilklendirmesiz tic; t = 0; for d = 1:deneySayisi clear y for i = 1:n y(i) = x(i)^2 - 4*x(i) + 3; end t = t + toc; end display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi)) %% Döngülü fakat ilklendirmeli tic; t = 0; for d = 1:deneySayisi clear y y = zeros(size(x)); for i = 1:n y(i) = x(i)^2 - 4*x(i) + 3; end t = t + toc; end display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi)) %% Vektörleştirme kullanımı tic; t = 0; for d = 1:deneySayisi clear y y = x.^2 - 4*x + 3; t = t + toc; end display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi))
Şimdi de sonuçlara bakalım:
Geçen ortalama süre: 13.945716 sn Geçen ortalama süre: 1.209971 sn Geçen ortalama süre: 0.304579 sn
Görüldüğü üzere ilklendirme yapmak, yani döngü kaçınılmazsa zeros
ile yer açmak işleri 10 kat kadar hızlandırıyor. Döngüden kaçınmak ise daha iyi bir yol ve ilk yönteme göre 40 kat kadar daha iyi! Örnekteki süre zaten kısa olduğu için fark size önemsiz gelebilir, fakat daha uzun çalışan kodlarda bu gelişme ciddi bir avantaj sağlayacaktır. Koda işlev kazandırdıktan sonra bir es verip kodu toparlamak iyi bir alışkanlıktır.
Not: Son sürümlerde bu konunun geliştirildiğini söylüyorlar, fakat görüldüğü üzere buna dikkat etmekte hâlâ çok fayda var.
Not 2: Polinom hesaplamak yerine sin
fonksiyonu ile de denedim, onda da benzer sonuçlar elde ediliyor.
2 yorum
Matlab versiyonu ne? 2011a ise ve bu sonuclari aldiysan kim bilir eski versiyonlarda bu durum nasildi? Cunku dedigin gibi bu durum 2011a'da guya iyilestirilmisti
kaynak