performance datensätze - Liste in R vorbelegen





zusammenfügen übersicht (4)


Etwas wie das:

   x <- vector('list', 10)

Aber die Verwendung von Lappy ist die beste Wahl

In R ist es ineffizient, eine Datenstruktur in einer Schleife zu erweitern. Wie reserviere ich eine list mit einer bestimmten Größe? matrix macht dies einfach über die Argumente ncol und nrow . Wie macht man das in Listen? Beispielsweise:

x <- list()
for (i in 1:10) {
    x[[i]] <- i
}

Ich nehme an, das ist ineffizient. Was ist ein besserer Weg, dies zu tun?




Um das zu erweitern, was @Jilber gesagt hat, wurde lapply speziell für diese Art von Operation entwickelt.

anstelle der for-Schleife könnten Sie verwenden:

x <- lapply(1:10, function(i) i)

Sie können dies auf kompliziertere Beispiele erweitern. Häufig kann das, was sich in dem Körper der for-Schleife befindet, direkt in eine Funktion übersetzt werden, die eine einzelne Zeile annimmt, die von jeder Iteration der Schleife wie eine Zeile aussieht.




vector kann leeren Vektor der gewünschten Modus und Länge erstellen.

x <- vector(mode = "list", length = 10)



flat_list = [item for sublist in l for item in sublist]

was bedeutet:

for sublist in l:
    for item in sublist:
        flat_list.append(item)

ist schneller als die bisher veröffentlichten Verknüpfungen. ( l ist die Liste, die abgeflacht werden soll.)

Hier ist die entsprechende Funktion:

flatten = lambda l: [item for sublist in l for item in sublist]

Zum Nachweis können Sie wie immer das Modul timeit in der Standardbibliothek verwenden:

$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 143 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 1.1 msec per loop

Erläuterung: Die auf + basierenden Tastenkombinationen (einschließlich der implizierten Verwendung in sum ) sind zwingend O(L**2) wenn L-Unterlisten vorhanden sind. Da die Zwischenergebnisliste immer länger wird, wird bei jedem Schritt ein neues Zwischenergebnis angezeigt Das Listenobjekt wird zugewiesen, und alle Elemente des vorherigen Zwischenergebnisses müssen kopiert werden (sowie einige neue, die am Ende hinzugefügt werden). Also (zur Vereinfachung und ohne tatsächlichen Verlust der Allgemeinheit) sagen Sie, dass Sie L Unterlisten von jeweils I-Elementen haben: Die ersten I-Elemente werden L-1-mal hin und her kopiert, die zweiten I-Elemente L-2-mal usw. Gesamtzahl der Kopien ist I mal die Summe von x für x von 1 bis L ausgeschlossen, dh I * (L**2)/2 .

Das Listenverständnis generiert nur einmal eine Liste und kopiert jedes Element (vom ursprünglichen Wohnort bis zur Ergebnisliste) ebenfalls genau einmal.





performance r list memory