2017-09-22 3 views
4

Ich habe einen Hintergrund in MATLAB, also habe ich die Tendenz, alles zu vektorisieren. Doch in Julia, ich getestet, diese beiden Funktionen:Julia - warum sind Schleifen schneller

function testVec(n) 
    t = [0 0 0 0]; 
    for i = 1:n 
     for j = 1:4 
      t[j] = i; 
     end 
    end 
end 

function testVec2(n) 
    t = [0 0 0 0]; 
    for i = 1:n 
     t.= [i i i i]; 
    end 
end 

@time testVec(10^4) 
0.000029 seconds (6 allocations: 288 bytes) 
@time testVec2(10^4) 
0.000844 seconds (47.96 k allocations: 1.648 MiB) 

Ich habe zwei Fragen:

  1. Warum sind Schleifen schneller?
  2. Wenn Schleifen tatsächlich schneller sind, gibt es dann "intelligente" Vektorisierungstechniken, die Schleifen nachahmen? Die Syntax für Schleifen ist hässlich und lang.
+1

off-topic: Bin ich die einzige hier Person, die der Matlab-Code voll von "smart" 'bsxfun' Vektorisierung Tricks fühlt, dass tatsächlich nur schwer zu lesen? In einigen Fällen brauchen wir nur Schleifen, also sollte es schnell sein;) – Gnimuc

Antwort

4

Im testVec2 Verfahren, wird der Code eine temporäre Vektor zuzuteilen zum Halten [i i i i] für jede Instanz von i in der Schleife. Diese Zuweisung ist nicht kostenlos. Sie können dies anhand der Anzahl der Zuweisungen in Ihren Timing-Ergebnissen sehen. Sie könnten versuchen, die folgenden:

function testVec3(n) 
    t = [0 0 0 0] 
    for i=1:n 
     t .= i 
    end 
end 
3
  1. Es ist alles Schleifen unter der Haube. Die vektorisierten Ausdrücke werden sowohl in Julia als auch in Matlab in Schleifen übersetzt. Am Ende sind es alles Loops. In Ihrem speziellen Beispiel ist dies, wie @sam sagt, weil Sie eine Menge zusätzlicher Arrays zuweisen, die Sie vermeiden können, wenn Sie explizit eine Schleife bilden. Der Grund, warum Sie Matlab immer noch tun, ist, dass dann alles in Funktionen gemischt wird, die in einer Hochleistungssprache (C oder Fortran, wahrscheinlich) geschrieben sind, also lohnt es sich auch, wenn Sie zusätzliche Zuweisungen vornehmen.

  2. Tatsächlich gibt es, wie @sam gezeigt hat. Here ist ein Blogbeitrag, in dem Sie alles über Broadcasting und Loopfusion erfahren.

Verwandte Themen