Warum ist die Vorbelegung für Listen hilfreich?

Ich verstehe, dass es nützlich ist, einen Vektor oder eine Matrix vorab zuzuweisen, da sie immer in einem zusammenhängenden Speicherblock gespeichert sind.

In Bezug auf eine Liste kann sie jedoch Elemente mit unterschiedlicher Länge und unterschiedlichen Modi enthalten. Also meine erste Vermutung ist dasEine Liste kann lediglich Zeiger auf die wahre Adresse ihrer Elemente enthalten. Hab ich recht? Eine verwandte Frage hierWas ist die interne Implementierung von Listen? Die Liste ist im Wesentlichen ein Array, sie behandelt jedoch nicht, wie die Elemente in einer Liste gespeichert werden, während sich die Größe der einzelnen Elemente ändern kann.

Beispiel 1: Wenn eine Liste enthälta,b,c,d,e, und wannmyList$a<-1:1000000, wird die Liste geändert (was nur bedeutet,a wird aktualisiert) oder wird die gesamte Liste kopiert und aktualisiert?

Beispiel 2

> system.time( { myList <- list()
+                myList$a <- 1:10000000
+                myList$b <- 1:10000100
+                myList$c <- 1:10000200 
+                myList$d <- 1:10000300})
   user  system elapsed 
   0.01    0.02    0.03

> system.time({ myList2<-list(a=1:10000000,b=1:10000100,c=1:10000200,d=1:10000300) })
   user  system elapsed 
   0.00    0.03    0.03 

würdemyList sehr ineffizient im Vergleich zumyList2 wegen keiner vorbelegung? Oder gar keinen merklichen Leistungsunterschied, egal wie großa,b,c,d sind da die ersten kopien nur noch ein paar mal zeiger?

Hier kommt es zur Vorbelegung. Wie sieht es bei einer Liste aus? Wird nur der Speicher für die Zeiger vorbelegt? Wenn dies der Fall ist, sehe ich keine Verwendung, da ohnehin nicht viel Daten für Zeiger kopiert werden.

> system.time( { myList <- vector("list", 4)
+                myList[[1]] <- 1:10000000
+                myList[[2]] <- 1:10000100
+                myList[[3]]  <- 1:10000200 
+                myList[[4]] <- 1:10000300
+                names(myList) <- letters[1:4]})
   user  system elapsed 
   0.01    0.02    0.03 

Antworten auf die Frage(2)

Ihre Antwort auf die Frage