In R, warum ist v [length (v) +1] = x besser als c (v, x)?

8

Ich schrieb die folgenden zwei Funktionen, eine zum Testen der zunehmenden Vektorgröße mit Verkettung und eine mit Klammern:

%Vor%

Das ist ein großer Zeitunterschied, und ich verstehe nicht, warum die Verwendung von Klammern so viel besser ist als die Verwendung von Verkettungen. Es scheint, als würde es in beiden Fällen Zeit brauchen, um neues Gedächtnis zuzuordnen, aber das scheint nicht wahr zu sein. Ich dachte auch, es könnte sein, dass c(v, x) bis x auf den gleichen Typ wie v vor dem Zusammenführen umrechnet, aber v[i] = as.vector(x) zu sagen ist kein bedeutender Zeitaufwand.

    
Bill 13.01.2017, 16:34
quelle

1 Antwort

3

Dies sollte wahrscheinlich ein Kommentar sein, da ich die tatsächliche Antwort nicht kenne, aber es wurde zu lang.

"c" und "[" sind beide primitiv, intern und generisch. Das bedeutet, dass der Methodenversand über C-Funktionen erfolgt, und zwar so weit, wie es bei der Beantwortung Ihrer eigentlichen Frage möglich ist. Etwas mysteriöses geht dort vor sich, und "[" ist in diesem besonderen Punkt effizienter als "c".

Ich möchte jedoch darauf hinweisen, dass diese beiden Methoden, wie einige, aber nicht alle Kommentare, nicht nur wegen der Vektorisierung ineffizient sind. Die Vorbelegung von Speicherplatz für die Größe des Vektors, den Sie erwarten, hilft sehr wesentlich, viel mehr als der Unterschied zwischen c und [ . Vorallokation gibt Ihnen eine 70% bis 90% Beschleunigung von der [ Version:

%Vor%

Dies ergibt:

%Vor%

Auch @Roland sagte: "Das Wachstum eines Objekts wird mit zunehmender Größe teurer". Wenn der Vektor größer wird, sind weniger bequeme Punkte im Speicher verfügbar.

Ich schätze, dass das e_test (vektorisiert) in Ihrem Fibonacci-Anwendungsfall nicht anwendbar ist, es aber trotzdem zum Vergleich gelassen hat, um eine Vorstellung von der Geschwindigkeit zu geben, mit der die Vektorisierung möglich ist.

    
Peter Ellis 14.01.2017, 05:16
quelle

Tags und Links