Der schnellste Weg, unterschiedliche Elemente aus einer Matrix/Liste abzurufenIch versuche, die verschiedenen Elemente in einem ziemlich großen Vektor zusammenzufassen, und frage mich, ob jemand einen schnelleren Weg kennt, als ein assoziatives Array zu erstellen. Ich habe Folgendes versucht.
Names Default to here(1);
dt = open("$SAMPLE_DATA\Probe.jmp");
rows = dt << Get rows Where(Num(:Wafer Number) <= 10);
times = Column(dt, "Start Time")[rows];
//option 1
st = HPTime();
distinct1 = associative array(as list(times));
distinct1 = distinct1 << Get Keys;
opt1 = HPTime()-st;
show(opt1);
//option 2
st = HPTime();
dt_sub = dt << Subset(
Selected Rows( 0 ),
Rows( rows ),
Selected columns only( 0 )
);
Summarize(dt_sub, distinct2 = by(:Start Time));
close(dt_sub, no save);
opt2 = HPTime()-st;
show(opt2);
//option 3
st = HPTime();
distinct3 = [];
for(i=1, i<=nrows(times), i++,
if(!any(distinct3 == times[i]),
distinct3 ||= times[i]
)
);
opt3 = HPTime()-st;
show(opt3);
//option 4
st = HPTime();
distinct4 = {};
for(i=1, i<=nrows(times), i++,
if(!Contains(distinct4, times[i]),
insert into(distinct4, times[i])
)
);
opt4 = HPTime()-st;
show(opt4);
show(nitems(distinct1), nitems(distinct2), nrows(distinct3`), nitems(distinct4));
Das ergab eine Ausgabe von:
opt1 = 1082;
opt2 = 40914;
opt3 = 5853;
opt4 = 8001;
N Items(distinct1) = 211;
N Items(distinct2) = 211;
N Zeilen(distinct3`) = 211;
N Items(distinct4) = 211;
*Bearbeiten* Okay, verwenden Sie auf keinen Fall ein assoziatives Array, da es keine Gleitkommaschlüssel zulässt und alles rundet. Die for-Schleife scheint für diesen Vorgang ziemlich langsam zu sein. Hat also jemand etwas Besseres?
Betreff: Der schnellste Weg, unterschiedliche Elemente aus einer Matrix/Liste abzurufenIch bin mir nicht sicher, wie schnell es ist, aber es ist schneller zu tippen ...
distinct = Design(times, <<LEVELS></LEVELS>
Betreff: Der schnellste Weg, unterschiedliche Elemente aus einer Matrix/Liste abzurufenFür die meisten meiner Sets, die ich getestet habe. Die Skalierung um 2^52 scheint am schnellsten zu sein (mit akzeptablem Verlust). Vielen Dank für all das Feedback.
Betreff: Der schnellste Weg, unterschiedliche Elemente aus einer Matrix/Liste abzurufenSchöne Verwendung von Zusammenfassung.
Die beste Lösung kann für Probleme unterschiedlicher Größe unterschiedlich sein; Ein großer Einrichtungsaufwand könnte sich bei einem ausreichend großen Problem auszahlen.
Ich habe untersucht, wie man Gleitkommazahlen in Schlüssel für assoziative Arrays umwandeln kann, und kam nur auf langsamere Antworten, die aus den Zahlen erstellte Zeichenfolgen beinhalten.
Sie können die Gleitkommazahlen in Ganzzahlen zwischen +/- 2^52 skalieren und die Ganzzahlen zum Indizieren assoziativer Arrays verwenden. Ja, 2^52, nicht 2^32 und nicht 2^64. Die von JMP verwendeten 8-Byte-Gleitkommazahlen mit doppelter Genauigkeit haben einen 52-Bit-Bruch Wikipedia . Dies wäre eine verlustbehaftete Konvertierung, könnte aber die meisten Informationen behalten.
Betreff: Der schnellste Weg, unterschiedliche Elemente aus einer Matrix/Liste abzurufenHier ist eine weitere Alternative, die Sie vielleicht ausprobieren möchten
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\Probe.jmp" );
dt << Select Where( Num( :Wafer Number ) > 10 );
dt << exclude;
dtSumm = dt << Summary(
private,
Group( :Start Time ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
dtSumm << delete rows;
Distinct = dtSumm:Start Time << get values;
Close( dtSumm, nosave );
dt << clear row states;
Betreff: Der schnellste Weg, unterschiedliche Elemente aus einer Matrix/Liste abzurufenIch habe das Gleiche mit einem assoziativen Array gemacht. Wie Sie bemerkt haben, müssen Sie zum Umgang mit Zahlen kleiner als Null/mit vielen Dezimalstellen zunächst eine Stichprobe der Daten nehmen, herausfinden, was ein guter Skalierungsfaktor wäre, und dann die Elemente des Vektors skalieren.
Das scheint immer noch schneller zu funktionieren als die Verwendung einer for-Schleife, da es sich um eine kleine Matrixmanipulation handelt, gefolgt von der Erstellung des assoziativen Arrays.