Hay una presuposición aquí, que la forma más eficiente de hacer un montón de "no contienen la matriz X?" checks es convertir la matriz a hash. La eficiencia depende del recurso escaso, a menudo el tiempo, pero a veces el espacio y, a veces el esfuerzo del programador. Al menos dobla la memoria consumida manteniendo una lista y un hash de la lista simultáneamente. Además, usted está escribiendo más código original que tendrá que probar, documento, etc.
Como alternativa, consulte el módulo Lista :: MoreUtils, específicamente las funciones any()
, none()
, true()
y false()
.Todos ellos toman un bloque como el condicional y una lista como argumento, similar a map()
y grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
me hizo una prueba rápida, carga en medio de/usr/share/dict/words a una array (25000 palabras), luego busca once palabras seleccionadas de todo el diccionario (cada 5.000 palabras) en la matriz, utilizando el método de matriz a hash y la función any()
de List :: MoreUtils.
En Perl 5.8.8 construido a partir de la fuente, el método de la matriz de hachís a 1100X va casi más rápido que el método any()
(1300X más rápido bajo Ubuntu 6.06 de Perl envasados 5.8.7.)
Ese no es el Sin embargo, la conversión de array a hash demora alrededor de 0.04 segundos, lo que en este caso mata la eficiencia de tiempo del método array-to-hash a 1.5x-2x más rápido que el método any()
. Sigue siendo bueno, pero no tan estelar.
Mi intuición es que el método array-to-hash va a vencer a any()
en la mayoría de los casos, pero me sentiría mucho mejor si tuviera algunas medidas más sólidas (muchos casos de prueba, análisis estadísticos decentes , tal vez algún análisis algorítmico de gran O de cada método, etc.) Dependiendo de sus necesidades, List :: MoreUtils puede ser una solución mejor; sin duda es más flexible y requiere menos codificación. Recuerde, la optimización prematura es un pecado ... :)
Éste es preferible a la otra porque no hace una lista temporal para inicializar el hash. Esto debería ser más rápido y consumir menos memoria. –
Esto no funciona cuando se prueba: test.pl: mi @arr = ("foo", "barra", "Baz"); my @hash {@arr} = 1; error de sintaxis en la línea test.pl 2, cerca de "@hash {" – Frosty
Frosty: Usted tiene que declarar "mi% de hash" en primer lugar, y luego hacer "@hash {@arr} = 1" (sin "mi"). –