Il modo più veloce per modificare elenchi di stringheSto cercando di filtrare un elenco di liste di stringhe. Come esempio:
Ho 2 liste, per il filtro 1, mi piacerebbe concatenare le due liste se la seconda lista non corrisponde ai primi elenchi di caratteri dopo la terza. Quindi, ad esempio "a3232", "32" violerebbe questo, ma "a32323", "32" non lo farebbe.
per il filtro 2 Vorrei rimuovere i trattini (o qualsiasi altro carattere si adatti alla tua fantasia).
Ho fatto una rapida funzione di esempio che restituisce la lista filtrata ma nel codice reale ci vuole un po 'di tempo.
Chiedersi se qualcuno ha avuto fortuna a fare cose simili più velocemente.
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);
Ho pensato di prema re le selezioni dei filtri ma, visto che il numero di filtri aggiunti, diventa un problema 2 ^ n, penso e sono preoccupato per il tempo di avvio.
Re: il modo più veloce per modificare liste di stringheQuesto non è un calcolo in realtà, è più un elemento di GUI, quindi la velocità deve essere veloce. Ecco i miei risultati quando l'ho provato.
Eseguendolo con un loop in JMP 13.1: 7.7 secondi
In esecuzione con la tabella dati in JMP 13 3,3 secondi
Esecuzione con loop in JMP 12.2: 2+ minuti
in esecuzione con la tabella dati in JMP 12.2: 3,5 secondi
Non so come hai ottenuto un tale aumento di velocità con il loop.
Re: il modo più veloce per modificare liste di stringheUn punto in più di iterare su elementi in una lista è che puoi costruire una finestra di dialogo che mostri lo stato di avanzamento:

I calcoli lenti sono molto più accettabili per gli utenti quando sanno quanto tempo devono aspettare e quando hanno la possibilità di interrompere se il tempo di completamento è più lungo di quanto previsto.
Re: il modo più veloce per modificare liste di stringheHo aumentato il numero di elementi negli elenchi a 1 milione. Il primo metodo impiegava 14 secondi, il secondo metodo 7 secondi e il terzo metodo 5 secondi. Questo è con la versione 13, quindi sembra che abbiano fatto un buon lavoro nel migliorare le prestazioni di elenchi di grandi dimensioni.
Re: il modo più veloce per modificare liste di stringheQuale versione di JMP stai usando? So che le liste sono migliorate in 13 ma ho una lista di 1.000.000 di articoli, quindi farli in un ciclo for è stato molto lento (sto lavorando a 12.2).
Inoltre, devo fare tutti i filtri contemporaneamente, quindi devo costruire la mia espressione filtro prima dinamicamente, quindi devo valutarlo.
Re: il modo più veloce per modificare liste di stringhePenso che la sovrabbondanza di valutazioni ecc. Abbia reso questo codice difficile da capire, quindi ho creato una versione semplificata.
Ecco il codice semplificato, concentrandoti sul secondo filtro, usando la tua struttura di codifica:
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);
Sul mio computer c'è la differenza di tempo di HP 2000 .
Successivamente, ho riscritto il codice per evitare l'uso di espressioni e evals ecc:
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);
Questo ha un miglioramento delle prestazioni di circa il 25% con la differenza di HP TIme riportata in ~ 1500 .
Le tabelle sono cose costose da usare, anche se private, quindi ecco un codice che non le usa:
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);
La differenza di orario HP riportata per questo codice è inferiore a 100 .