Schnellste Möglichkeit zum Bearbeiten von StringlistenIch versuche, eine Liste von Stringlisten zu filtern. Als Beispiel:
Ich habe 2 Listen, für Filter 1 möchte ich die beiden Listen zusammenfassen, wenn die zweite Liste nicht mit den ersten Listenzeichen nach dem dritten übereinstimmt. Zum Beispiel würde "a3232", "32" dies verletzen, "a32323", "32" jedoch nicht.
Für Filter 2 möchte ich Bindestriche entfernen (oder den beliebigen Charakter, der zu Ihnen passt).
Ich habe eine schnelle Beispielfunktion erstellt, die die gefilterte Liste zurückgibt. In echtem Code dauert dies jedoch einige Zeit.
Ich frage mich, ob jemand Glück hatte, ähnliche Dinge schneller zu machen.
Names Default to here(1);
x = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
filterfunc = function({bothlists},
{DEFAULT LOCAL},
f = Expr(column(dt, "1")[]||column(dt, "2")[]);
dt = New Table("Test", private,
New Column("1", character, set values(bothlists[1])),
New Column("2", character, set values(bothlists[2])),
//New Column("First 3", character, Formula(Left(column(dt, "1")[], 3))),
New Column("Remainder", character, Formula(Right(column(dt, "1")[], length(column(dt, "1")[])-3))),
New Column("Filter", character ),
);
filter1 = 1; // filter to remove duplicates from of remainder
//after the first 3 of column 1 and the total of column 2
filter2 = 1; //filter to remove hyphens
if(filter1,
Substitute into(f,
Expr(column(dt, "2")[]),
Expr(if(Column(dt, "Remainder")[] != column(dt, "2")[],
column(dt, "2")[],
""
))
)
);
if(filter2,
Substitute into(f,
nameexpr(f),
EvalExpr(Substitute(Expr(nameexpr(f)), "-", ""))
)
);
Column(dt, "Filter") << Formula(nameexpr(f));
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
close(dt, no save);
values;
);
st = HPTime(); //start of routine
filtered_stuff = filterfunc(x);
tot = HPTime() - st;
show(tot);
Ich habe darüber nachgedacht, die Filterauswahl vorzubereiten, aber da sich die Anzahl der Filter summiert, wird dies zu einem Problem, denke ich, und ich mache mir Sorgen um die Startzeit.
Re: Schnellste Möglichkeit, Listen von Strings zu bearbeitenDas ist eigentlich keine Berechnung, es ist eher ein Gui-Element, also muss die Geschwindigkeit schnell sein. Hier sind meine Ergebnisse, als ich es ausprobierte.
Ausführen mit einer Schleife in JMP 13.1: 7.7 Sekunden
Laufen mit der Datentabelle in JMP 13 3,3 Sekunden
Ausführung mit Schleife in JMP 12.2: 2+ Minuten
läuft mit der Datentabelle in JMP 12.2: 3,5 Sekunden
Ich weiß nicht, wie Sie mit der Schleife eine solche Geschwindigkeitssteigerung hatten.
Re: Schnellste Möglichkeit, Listen von Strings zu bearbeitenEin Pluspunkt beim Durchlaufen von Elementen in einer Liste ist, dass Sie ein Dialogfenster erstellen können, das den Fortschritt anzeigt:

Langsame Berechnungen sind für Benutzer viel akzeptabler, wenn sie wissen, wie lange sie warten müssen, und wann sie die Möglichkeit haben, abzubrechen, wenn die Fertigstellungszeit länger ist als erwartet.
Re: Schnellste Möglichkeit, Listen von Strings zu bearbeitenIch habe die Anzahl der Einträge in den Listen auf 1 Million erhöht. Die erste Methode dauerte 14 Sekunden, die zweite Methode 7 Sekunden und die dritte Methode 5 Sekunden. Dies ist mit Version 13 der Fall, also sieht es so aus, als hätten sie gute Arbeit geleistet, um die Leistung großer Listen zu verbessern.
Re: Schnellste Möglichkeit, Listen von Strings zu bearbeitenWelche Version von JMP verwenden Sie? Ich weiß, dass die Listen in 13 verbessert wurden, aber ich habe eine Liste mit 1.000.000 Elementen. Daher war es sehr langsam, sie in einer for-Schleife auszuführen (12.2).
Außerdem muss ich alle Filter gleichzeitig ausführen, sodass ich meinen Filterausdruck zuerst dynamisch erstellen und dann bewerten muss.
Re: Schnellste Möglichkeit, Listen von Strings zu bearbeitenIch denke, der Überfluss an Evals usw. hat es mir schwer gemacht, diesen Code zu verstehen, also habe ich eine vereinfachte Version erstellt.
Hier ist der vereinfachte Code, der sich nur auf den zweiten Filter konzentriert, wobei Ihre Codierungsstruktur verwendet wird:
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
dt = New Table("Test",Private,
New Column("1", character, Set Values(bothlists[1])),
New Column("2", character, Set Values(bothlists[2])),
New Column("Filter", character)
);
f = Expr(column(dt, "1")[]||column(dt, "2")[]);
Substitute into(f,
nameexpr(f),
EvalExpr(Substitute(Expr(nameexpr(f)), "-", ""))
);
Column(dt, "Filter") << Formula(nameexpr(f));
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
t2 = HpTime();
show(t2-t1);
show(values);
Auf meinem Computer ist der HP-Zeitunterschied ungefähr 2000 .
Als Nächstes habe ich den Code umgeschrieben, um die Verwendung von Ausdrücken und Evals usw. zu vermeiden:
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
dt = New Table("Test", Private,
New Column("1", character, Set Values(bothlists[1])),
New Column("2", character, Set Values(bothlists[2])),
New Column("Filter", character)
);
Column(dt, "Filter") << Formula(
Substitute( :Name( "1" ) || :Name( "2" ), "-", "" )
);
dt << Run Formulas;
values = Column(dt, "Filter") << Get Values;
t2 = HpTime();
show(t2-t1);
show(values);
Dies führt zu einer Verbesserung der Leistung um etwa 25%, wobei der angegebene HP TIme Difference ~ ist 1500 .
Tabellen sind teuer zu verwenden, auch wenn sie privat sind. Hier ist ein Code, der sie nicht verwendet:
t1 = HpTime();
bothlists = {{"a2232", "b12", "c-", "d3341234", "e12647859"}, {"32", "32", "54", "", "64"}};
lst = {};
For (i=1,i<=NItems(bothlists[1]),i++,
lst[i] = Substitute( bothlists[1][i] || bothlists[2][i], "-", "" )
);
t2 = HpTime();
show(t2-t1);
show(lst);
Die gemeldete HP-Zeitdifferenz für diesen Code ist kleiner als 100 .