Hay una presuposición aquí, que la forma más eficiente de hacer mucho "¿La matriz contiene X?" cheques es convertir la matriz en un hash. La eficiencia depende de los recursos escasos, a menudo de tiempo pero a veces de espacio y, a veces, del esfuerzo del programador. Al menos está duplicando la memoria consumida al mantener una lista y un hash de la lista simultáneamente. Además, está escribiendo más código original que necesitará probar, documentar, etc.
Como alternativa, mirada en el módulo de lista :: MoreUtils, específicamente las funciones any()
, none()
, true()
y false()
. Todos toman un bloque como condicional y una lista como argumento, similar a map()
y grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
Ejecuté una prueba rápida, cargando la mitad de / usr / share / dict / words en una matriz (25000 palabras), luego busqué once palabras seleccionadas de todo el diccionario (cada 5000 palabras) en la matriz, usando tanto la matriz -to-hash y la any()
función de List :: MoreUtils.
En Perl 5.8.8 construido a partir de la fuente, el método de matriz a hash se ejecuta casi 1100 veces más rápido que el any()
método (1300 veces más rápido en el paquete Perl 5.8.7 de Ubuntu 6.06).
Sin embargo, esa no es la historia completa: la conversión de matriz a hash tarda aproximadamente 0.04 segundos, lo que en este caso mata la eficiencia de tiempo del método de matriz a hash a 1.5x-2x más rápido que el any()
método. Sigue siendo bueno, pero no tan estelar.
Mi intuición es que el método de matriz a hash va a superar any()
en la mayoría de los casos, pero me sentiría mucho mejor si tuviera algunas métricas más sólidas (muchos casos de prueba, análisis estadísticos decentes, tal vez algunos grandes- O análisis algorítmico de cada método, etc.) Dependiendo de sus necesidades, List :: MoreUtils puede ser una mejor solución; ciertamente es más flexible y requiere menos codificación. Recuerde, la optimización prematura es un pecado ... :)