Es sieht so aus, als hätte Wes ein bekanntes Problem entdeckt, data.table
als die Anzahl der eindeutigen Zeichenfolgen ( Ebenen ) groß war: 10.000.
Zeigt Rprof()
die meiste Zeit des Anrufs an sortedmatch(levels(i[[lc]]), levels(x[[rc]])
? Dies ist nicht wirklich der Join selbst (der Algorithmus), sondern ein vorläufiger Schritt.
In jüngster Zeit wurden Zeichenspalten in Schlüsseln zugelassen, wodurch dieses Problem durch eine engere Integration in Rs eigene globale Zeichenfolgen-Hash-Tabelle behoben werden sollte. Einige Benchmark-Ergebnisse wurden bereits von gemeldet, test.data.table()
aber dieser Code ist noch nicht angeschlossen, um die Level-to-Level-Übereinstimmungen zu ersetzen.
Sind Pandas schneller zusammengeführt als data.table
bei normalen Ganzzahlspalten? Dies sollte eine Möglichkeit sein, den Algorithmus selbst gegenüber Faktorproblemen zu isolieren.
Auch data.table
hat Zeitreihen im Auge zu behalten. Zwei Aspekte dazu: i) mehrspaltig geordnete Schlüssel wie (id, datetime) ii) schnell vorherrschende join ( roll=TRUE
), auch bekannt als letzte übertragene Beobachtung.
Ich werde einige Zeit brauchen, um zu bestätigen, da es das erste Mal ist, dass ich den Vergleich mit data.table
dem präsentierten gesehen habe.
UPDATE von data.table v1.8.0 veröffentlicht im Juli 2012
- Interne Funktion sortedmatch () entfernt und durch chmatch () ersetzt, wenn i-Ebenen mit x-Ebenen für Spalten vom Typ 'Faktor' abgeglichen werden. Dieser vorläufige Schritt verursachte eine (bekannte) signifikante Verlangsamung, wenn die Anzahl der Ebenen einer Faktorsäule groß war (z. B.> 10.000). Verschärft durch Tests zum Verbinden von vier solchen Spalten, wie Wes McKinney (Autor des Python-Pakets Pandas) demonstrierte. Das Abgleichen von 1 Million Zeichenfolgen, von denen 600.000 einzigartig sind, wird jetzt beispielsweise von 16 auf 0,5 Sekunden reduziert.
auch in dieser Veröffentlichung war:
Zeichenspalten sind jetzt in Schlüsseln zulässig und werden bevorzugt berücksichtigt. data.table () und setkey () zwingen Zeichen nicht mehr zum Faktor. Faktoren werden weiterhin unterstützt. Implementiert FR # 1493, FR # 1224 und (teilweise) FR # 951.
Neue Funktionen chmatch () und% chin%, schnellere Versionen von match () und% in% für Zeichenvektoren. Der interne String-Cache von R wird verwendet (es wird keine Hash-Tabelle erstellt). Sie sind ungefähr viermal schneller als match () im Beispiel in? Chmatch.
Ab September 2013 ist data.table v1.8.10 für CRAN und wir arbeiten an v1.9.0. NEWS wird live aktualisiert.
Aber wie ich ursprünglich oben geschrieben habe:
data.table
hat Zeitreihenverschmelzung im Sinn. Zwei Aspekte dazu: i) mehrspaltig geordnete Schlüssel wie (id, datetime) ii) schnell vorherrschende join ( roll=TRUE
), auch bekannt als letzte übertragene Beobachtung.
Der Pandas-Equi-Join aus zwei Zeichenspalten ist also wahrscheinlich immer noch schneller als data.table. Da es so klingt, als würde es die kombinierten zwei Spalten hashen. data.table hasht den Schlüssel nicht, da die vorherrschenden geordneten Joins berücksichtigt wurden. Ein "Schlüssel" in data.table ist buchstäblich nur die Sortierreihenfolge (ähnlich einem Clustered-Index in SQL; dh so werden die Daten im RAM sortiert). Auf der Liste stehen beispielsweise Sekundärschlüssel.
Zusammenfassend sollte der eklatante Geschwindigkeitsunterschied, der durch diesen speziellen Test mit zwei Zeichenspalten mit über 10.000 eindeutigen Zeichenfolgen hervorgehoben wird, jetzt nicht so schlimm sein, da das bekannte Problem behoben wurde.
data.table
erbt nur vondata.frame
, aber es basiert auf C-Code unter der Haube.