1. ホーム
  2. arrays

[解決済み] Perl の配列を繰り返し処理する最適な方法

2022-03-11 13:38:09

質問

Perlの配列を反復処理するための最適な実装(スピードとメモリ使用量の点から)はどれですか?何か良い方法はありますか?( @Array は保持する必要はありません)。

実装1

foreach (@Array)
{
      SubRoutine($_);
}

実装2

while($Element=shift(@Array))
{
      SubRoutine($Element);
}

実装3

while(scalar(@Array) !=0)
{
      $Element=shift(@Array);
      SubRoutine($Element);
}

実装 4

for my $i (0 .. $#Array)
{
      SubRoutine($Array[$i]);
}

実装 5

map { SubRoutine($_) } @Array ;

解決方法は?

  • 速度の面では。#1位と4位ですが、ほとんどの場合、それほど差はありません。

    ベンチマークを書いて確認するのもいいですが、反復作業をPerlではなくCで行い、配列要素の無駄なコピーが発生しない分、#1や#4の方が若干速くなるのではないでしょうか。( $_ エイリアス の要素に対して、#2 と#3 は実際には コピー は、配列からスカラーを取得します)。

    #5も似たようなものかもしれません。

  • メモリ使用量という点では 5番以外はすべて同じです。

    for (@a) は、配列の平坦化を避けるために特殊なケースを使用しています。ループは配列のインデックスを繰り返し処理します。

  • 読みやすさの点では #1.

  • 柔軟性という点では。#1/#4と#5です。

    #2は偽の要素をサポートしない。#2と#3は破壊的である。