Vraag Kan ik een array initialiseren naar een opgegeven grootte in Perl?


Ik heb een sectie in mijn code waar ik weet dat ik een array nodig heb en ik weet precies hoeveel elementen die array nodig zullen hebben. Dit deel van de code zal veel worden herhaald, dus ik zou heel veel tijdwinst kunnen behalen door eerst die array te initialiseren naar de grootte die ik ken dat hij nodig heeft en dan vol te proppen versus alleen maar items aan te duwen (duwen zou O zijn ( n) in tegenstelling tot het opvullen van reeds gemaakte spaties, wat O (1) zou zijn).

Dat gezegd hebbende, ik kan geen elegante manier vinden om een ​​array op een bepaalde grootte te initialiseren, en ik heb geen idee waarom. Ik weet dat ik het kan doen:

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

om een ​​array van 50 items te krijgen, maar dat lijkt me echt lelijk en ik heb het gevoel dat er een betere manier moet zijn. Ideeën?


18
2018-01-20 19:39


oorsprong


antwoorden:


Om eerlijk te zijn is je weg prima, omdat de omvang van de array expliciet wordt gewijzigd: $#array = 49;;


14
2018-01-20 19:42



  1. De eerste regel van Optimization Club is, u optimaliseert niet.
  2. De tweede regel van Optimization Club is, dat doet u niet optimaliseren zonder te meten.

Meet, meet, meet voordat je gaat en ga ervan uit dat je het sneller kunt doen door Perl eruit te fikken. Perl doet de optimalisatie van algemeen gebruik al veel langer dan jij. Geloof het.


12
2018-01-20 20:33



Wanneer u erover nadenkt om dit type optimalisatie te doen, doe dan wat profilering! Het resultaat is misschien niet wat u verwacht. Ik heb bijvoorbeeld het volgende quick script gebruikt om uw theorie te testen dat het vooraf toewijzen van de array sneller is:

for ( my $loops = 0; $loops < 100000; $loops++ )
{
    my @arr;

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

Dat kostte 2,13 seconden.

for ( my $loops = 0; $loops < 100000; $loops++ )
{
    my @arr;
    $arr[49] = 0;

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

Dat kostte 2,16 seconden (ik heb beide tests verschillende keren uitgevoerd). Dus het eindigt uiteindelijk sneller om perl de array gewoon te laten toewijzen als dat nodig is.

Bijwerken

Na het aanbrengen van door ysth gesuggereerde wijzigingen, zijn de getallen logischer: 2,27 seconden voor de "push" -methode en 2,21 voor pre-toewijzing. Toch zou ik me afvragen of een dergelijke optimalisatie echt alle tijd zou besparen (het verschil was slechts 0,06 seconden na 100.000 iteraties).


6
2018-01-20 20:26



Gebruik undef in plaats van een specifieke waarde

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

2
2017-08-02 11:57



Je manier is geweldig, en dat geldt ook voor DVK's. Een manier om het in één opdracht te doen kan zijn:

@array = (0 .. 49);

Maar ik weet niet zeker of het eleganter is, omdat het een waarde toekent tussen 1 en 49 voor elk element, maar het is waarschijnlijk intuïtiever om het te begrijpen voor een programmeur die niet veel doet aan de syntaxis van Perl.


2
2018-01-20 19:48



Preallocating helpt misschien niet veel met de snelheid, maar het kan helpen met het terugsturen van het geheugen naar het systeem als de toegewezen chunks groot genoeg zijn


1
2017-07-04 12:13