1. ホーム
  2. arrays

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

2022-12-11 05:19:27

質問

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は破壊的である。