Esiste un modo rapido per creare un elenco di grandi dimensioni senza un ciclo for?Molti linguaggi di programmazione hanno una qualche forma.
Ad esempio per creare a elenco da 1 a 100:
list = 1:100,
O
list = range(1,100)
O
list = {1..100}
O
list = seq(1,100)
Fammi sapere! Non sono riuscito a trovare nulla nella guida allo scripting.
Ri: Esiste un modo rapido per creare un elenco di grandi dimensioni senza un ciclo for?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Questo strumento di profilazione tornerà utile.Grazie per averlo condiviso
Sembra che tu abbia ragione, il motivo per cui non sembra funzionare più velocemente è perché ci sono colli di bottiglia più grandi nel codice.Sembra che il codice matrice "::" venga eseguito più velocemente del ciclo for, il che è intuitivo.Lo capisco confrontando % nella riga 10+11 con % nella riga 31.
Il mio codice attuale non confronterà mai grandi serie di dati, ma ero comunque curioso perché prevedo di creare script simili per quantità maggiori di dati e sbarazzarsi dei cicli for è un modo generale sicuro per rendere il codice più veloce.
Ri: Esiste un modo rapido per creare un elenco di grandi dimensioni senza un ciclo for?Bel test delle prestazioni.
JSL dispone di un profiler che può aiutare a rispondere alle domande sulle prestazioni:

L'ho eseguito per ottenere questo:

il che mi dice che l'impostazione dei valori nell'array associativo è un collo di bottiglia in questo codice.(riga 10 vs riga 11.) (La riga 23 probabilmente include l'apertura del registro la prima volta, ignoralo; 42 è più rappresentativa.)
La classe grande ha solo 40 righe.Se avessi molte più righe (10K?) potresti vedere altri colli di bottiglia.Non chiamare temparray<
Sembra che tu stia tentando di creare una tabella di ricerca di piccoli numeri interi consecutivi per ciascun valore univoco nella colonna.Potrebbe esserci un modo intelligente per farlo, ma al momento non lo vedo.Forse qualcun altro lo farà... forse qualche operazione di unione al database?
Ri: Esiste un modo rapido per creare un elenco di grandi dimensioni senza un ciclo for?Grazie, è utile.Speravo che questo accelerasse il mio codice, ma sembra che il ciclo for abbia velocità simili, il che mi sorprende.Eventuali suggerimenti?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
t1 = tick seconds();
numberarray = Function({list},
temparray = Associative Array(list);
tempnum = nitems(temparray << Get Keys);
tempitems = temparray << Get Keys;
templist = {};
For(l=1, l<=tempnum, l++, insertinto(templist, l));
temparray = Associative Array(tempitems, templist);
//return(temparray)
);
for(i=1, i<=100,i++,
array = numberarray( Column(dt, 1) );
array2 = numberarray( Column(dt, 2) );
array3 = numberarray( Column(dt, 3) );
array4 = numberarray( Column(dt, 4) );
array5 = numberarray( Column(dt, 5) ););
t2 = tick seconds();
Print( Concat( Char( t2 - t1 ), " seconds." ) );
t1 = tick seconds();
numberarray = Function({list},
temparray = Associative Array(list);
tempnum = nitems(temparray << Get Keys);
tempitems = temparray << Get Keys;
temparray = Associative Array(tempitems, 1::tempnum);
);
for(i=1, i<=100,i++,
array = numberarray( Column(dt, 1) );
array2 = numberarray( Column(dt, 2) );
array3 = numberarray( Column(dt, 3) );
array4 = numberarray( Column(dt, 4) );
array5 = numberarray( Column(dt, 5) ););
t2 = tick seconds();
Print( Concat( Char( t2 - t1 ), " seconds." ) );
Ri: Esiste un modo rapido per creare un elenco di grandi dimensioni senza un ciclo for?
a=3;
b=9;
AsList(a::b)[1]
Risultati in:
{3, 4, 5, 6, 7, 8, 9}
diverse cose succedono qui: a::b crea una matrice di una riga: [3 4 5 6 7 8 9]
AsList( ... ) converte la matrice in un elenco di elenchi (perché è in realtà bidimensionale, con una delle dimensioni che è solo 1.
[1] estrae l'elenco interno.
Forse vuoi solo la matrice anziché l'elenco.Se sei interessato al codice veloce, usa le funzioni di matrice integrate quando puoi.
Questo non è un iteratore magico di qualche altro linguaggio di programmazione; Esso Volere crea la matrice e l'elenco completi in memoria, quindi probabilmente non vorrai creare un elenco di un miliardo di elementi.