recorrer print funciones array perl

funciones - print array perl



¿Puedo inicializar una matriz a un tamaño dado en Perl? (6)

Tengo una sección en mi código donde sé que necesitaré una matriz, y sé exactamente cuántos elementos tendrá que tener esa matriz. Esta sección del código se repetirá mucho, por lo que podría obtener grandes ahorros de tiempo al inicializar primero la matriz al tamaño que sé que necesitará y luego rellenarlo frente a solo empujar elementos (empujar sería O n) a diferencia de llenar espacios ya creados, que serían O (1)).

Dicho esto, parece que no encuentro una forma elegante de inicializar una matriz a un tamaño determinado, y no tengo idea de por qué. Sé que puedo hacer:

my @array; $array[49] =0;

para obtener una matriz de 50 elementos, pero eso me parece muy feo y siento que debe haber una mejor manera. Ideas?


  1. La primera regla de Optimization Club es que no optimizas.
  2. La segunda regla de Optimization Club es que no se optimiza sin medir.

Mida, mida, mida antes de ir y suponga que puede hacerlo más rápido simulando a Perl. Perl ha estado haciendo la optimización del uso común mucho más tiempo que usted. Confía en ello.


Cuando esté pensando en hacer este tipo de optimización, ¡haga un poco de perfil! El resultado puede no ser lo que esperas. Por ejemplo, usé el siguiente script rápido para probar su teoría de que la asignación previa de la matriz es más rápida:

for ( my $loops = 0; $loops < 100000; $loops++ ) { my @arr; for ( my $foo = 0; $foo < 50; $foo++ ) { push @arr, ''bar''; } }

Eso tomó 2.13 segundos.

for ( my $loops = 0; $loops < 100000; $loops++ ) { my @arr; $arr[49] = 0; for ( my $foo = 0; $foo < 50; $foo++ ) { $arr[$foo] = ''bar''; } }

Eso tomó 2.16 segundos (corrí ambas pruebas varias veces). Por lo tanto, en realidad es más rápido simplemente dejar que perl se encargue de asignar la matriz según sea necesario.

Actualizar

Después de hacer los cambios sugeridos por ysth, los números tienen un poco más de sentido: 2.27 segundos para el método "push" y 2.21 para la asignación previa. Aun así, me preguntaría si tal optimización realmente ahorraría tiempo (la diferencia fue de solo 0.06 segundos después de 100,000 iteraciones).


En lugar de un valor específico use undef

my @array; $array[49] = undef;


La asignación previa podría no ayudar mucho con la velocidad, pero podría ayudar a devolver la memoria al sistema si los trozos asignados son lo suficientemente grandes


Ser honesto a tu manera está perfectamente bien, ya que está cambiando explícitamente el tamaño de la matriz: $#array = 49; ;


Tu camino es genial, y también lo es el DVK. Una forma de hacerlo en un solo comando podría ser:

@array = (0 .. 49);

Pero no estoy seguro de si es más elegante, ya que asigna un valor entre 1 y 49 a cada elemento, pero probablemente sea más intuitivo de entender para un programador que no tiene mucho que ver con la sintaxis de Perl.