C'è un presupposto qui, che il modo più efficiente per fare un sacco di "L'array contiene X?" controlla è per convertire la matrice in un hash. L'efficienza dipende dalla risorsa scarsa, spesso il tempo ma a volte lo spazio e talvolta lo sforzo del programmatore. Stai almeno raddoppiando la memoria consumata tenendo contemporaneamente una lista e un hash della lista. Inoltre si sta scrivendo codice originale più che avrete bisogno di testare, documenti, ecc
In alternativa, guardare il modulo Lista :: moreutils, in particolare le funzioni any()
, none()
, true()
e false()
.Tutti prendono un blocco come il condizionale e una lista come argomento, simile a map()
e grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
ho eseguito un test rapido, il carico a metà di/usr/share/dict/parole per un array (25000 parole), quindi cercando undici parole selezionate nell'intero dizionario (ogni 5000 ° parola) nell'array, utilizzando sia il metodo array-to-hash che la funzione any()
da List :: MoreUtils.
Sul Perl 5.8.8 installato dal codice sorgente, il metodo array-to-hash corre quasi 1100X più veloce del metodo any()
(1300X più veloce sotto Ubuntu 6.06 del confezionato Perl 5.8.7.)
Questo non è il storia completa tuttavia: la conversione da array ad hash richiede circa 0,04 secondi, che in questo caso elimina l'efficienza temporale del metodo array-to-hash a 1,5x-2x più veloce rispetto al metodo any()
. Comunque buono, ma non così stellare.
Il mio istinto è che il metodo array-to-hash sta andando a battere any()
nella maggior parte dei casi, ma mi sentirei molto meglio se avessi alcune metriche più solide (un sacco di casi di test, analisi statistiche decenti , forse qualche analisi algoritmica big-O di ogni metodo, ecc.) A seconda delle esigenze, List :: MoreUtils potrebbe essere una soluzione migliore; è sicuramente più flessibile e richiede meno codice. Ricorda, l'ottimizzazione prematura è un peccato ... :)
questo è preferibile rispetto all'altro perché non crea una lista temporanea per inizializzare l'hash. Questo dovrebbe essere più veloce e consumare meno memoria. –
Questo non funziona quando testato: test.pl: my @arr = ("foo", "bar", "baz"); my @hash {@arr} = 1; Errore di sintassi alla riga test.pl 2, vicino a "@hash {" – Frosty
Frosty: devi prima dichiarare "my% hash", quindi fare "@hash {@arr} = 1" (no "my"). –