Nach der vorherigen Frage mit data.table
Können wir die binäre Suche verwenden, um
zu finden? %Vor% Denken Sie daran, dass DT[J('a',25)] == DT[x=='a' & y==25]
Ja:
Um eine binäre Suche zu machen, brauchen wir die entsprechenden Indizes.
Benchmarking :
Dies gibt uns mehr als eine 10x Verbesserung über vektorisierte Suche.
Der Einfachheit halber können wir den "creating the index" Teil des Codes in eine nette Funktion einfügen, damit wir es dann in einer einzigen Zeile aufrufen können. Zum Beispiel:
%Vor% Dabei ist OrIndx()
wie folgt definiert:
Die Idee hier ist, dass die Durchführung einer "oder" -Seration eine Art von Kombination erfordert Bei einer Standardvektorsuche ist diese Kombination die Ergebnisse jedes einzelnen Vektorservers.
data.table bietet einige große Geschwindigkeitsverbesserungen, indem seraches wie
erlaubt werden %Vor%Daher wäre eine natürliche Lösung für die Frage:
%Vor% Das einzige Problem ist, dass das Recycling nicht richtig funktioniert.
Es wäre ideal, eine Option wie
Aber soweit ich das beurteilen kann, wurde das (noch nicht!) nicht umgesetzt
Stattdessen können wir entsprechende Kombinationen vornehmen.
Die obige Funktion OrIndx
macht genau das. (es ist schnell & amp; schmutzig und es gibt effizientere Möglichkeiten, den Index zu erstellen)
Gemäß @Aruns-Vorschlag enthalten wir
%Vor%Getestet in 1e6- und 1e7-Zeilen:
%Vor% Beachten Sie, dass bei kleinen Tables (weniger als 15K
rows) die Vektorsuche schneller ist (bei wirklich kleinen Tabellen etwa doppelt so schnell)
Dieses Muster bleibt bis etwa 10.000 Zeilen erhalten. An diesem Punkt beginnen wir, die Verstärkungen zu sehen:
%Vor%Tags und Links r data.table