<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Sto cercando di vedere se esiste un modo più veloce per filtrare un elenco in base alle corrispondenze parziali.Vedi il codice qui sotto. Questo è comunque per JMP 12, prima di tutti i miglioramenti dell'elenco.
i nomi sono predefiniti qui ( 1 );
dt = Nuovo tavolo ( "Test" ,
Nuova colonna ( "Qualche elenco" , Imposta valori( 1 :: 100000 )),
privato
);
lista = Colonna (dt, "Qualche elenco" )<< Tipo di dati (Personaggio) << Ottieni valori ;
vicino (dt, nessun salvataggio);
filter_by_partial_match = Funzione ({elenco, valore},
dt = Nuova tabella ( "Più veloce?" ,
Nuova colonna ( "lista dei contenuti" , Carattere, Imposta valori (elenco)),
Nuova colonna ( "Bool" , Formula( Contiene ( minuscolo (:elenco fun), minuscolo (valore) )) ),
privato
);
bool = loc ( Colonna (dt, "Bool" )<< Ottieni valori );
filtered_list = :funlist[bools];
vicino (dt, nessun salvataggio);
lista_filtrata;
);
ora_inizio = HPTime ();
filtered_list = filter_by_partial_match(lista, "2" );
t_tempo = HPTime () - Ora di inizio;
spettacolo (t_ora, nitems(lista_filtrata));
qualcuno conosce un modo migliore?
Credo che la tabella dati goda del vantaggio del multithreading (formule col, ecc.). Quindi, sarei sorpreso se ci fosse un modo più veloce per farlo in JMP 12.
Sì, ci sarebbe sicuramente un sovraccarico nel rendere l'intero elenco in minuscolo.Potresti almeno rendere il valore in minuscolo.Ma ancora una volta il guadagno in termini di prestazioni non è molto.
Come si fa a rendere l'intero elenco in minuscolo?Il costo di farlo non supererebbe gli eventuali benefici che ne trarrai?
Sì, adoro il miglioramento dell'elenco 13. Ma sfortunatamente devo usarne 12 per il cliente.Adoro dire loro di andare a 13 ma probabilmente è un tentativo inutile.
L'hai già provato nella versione 13? Ecco i miei risultati utilizzando l'approccio della tabella privata:
t_tempo = 115828;
N elementi(filtered_list) = 40951;
Ecco i risultati utilizzando un ciclo:
t_tempo = 61895;
N elementi(filtered_list) = 40951;
Al contrario, questo è quello che ho ottenuto rispettivamente nella versione 12:
t_tempo = 127356;
N elementi(filtered_list) = 40951;
t_tempo = 161896168;
N elementi(filtered_list) = 40951;
Ottengo un leggero miglioramento se rimuovo la funzione minuscola dalla formula della colonna e invio invece un elenco minuscolo e imposto il valore su minuscolo.Altrimenti sembra abbastanza veloce.
È veloce! Gli approcci loop o regex non si avvicinavano nemmeno (ho provato e fallito...).