最も効率的なものは実際には異なります。
- ハッシュは順不同です。文字列キーによって、ほぼ一定の時間で値を検索できます。ルックアップは計算コストが高く、少なくとも配列ルックアップよりも 1 桁遅くなります。ハッシュのパフォーマンスは、「バケット」の数とキーの数によって異なります。ただし、ハッシュ ルックアップは、すべての重要なケースの要素を見つけるために配列をループするよりも高速です。ハッシュは、配列よりも多くのスペースを必要とします。
- Perl の配列には、配列 (ランダム アクセス) と二重にリンクされたリスト (プッシュ、ポップ、シフト、シフト解除による) の両方の特性があります。それらは使いやすく、十分に高速です。複数の要素を追加/削除する場合は、スライスまたは
splice
関数を使用します。splice
はpush
..の一般化でありunshift
、ループよりも高速です。
文字列を使用して、整数の配列を格納できます。これは非常に効率的ですが、非常に制限されています (int のみ)。
my $string = "";
my $i = ~ 0; # a really big number
$string .= chr $i; # get character from integer
# Access elements via `substr`:
my $j = ord substr $string, -1, 1; # last element; ord gets an int from a char
文字列の使用には、配列 (ランダム アクセス) と単一の連結リスト (追加は で簡単.=
) の特徴があります。他の操作もかなり高速です (substr
多くの用途があります)。
実用的なプログラマは、ほとんどのシーケンシャル データに配列を使用します。また、 、、および(速度を上げるために C で記述)などの関数を提供するList::Util
およびの効率的な関数を利用することもできます。List::MoreUtils
sum
average
max
min
値のリストを作成していて、固定量のみが必要な場合は、新しい要素を追加するときに次のようにします。
push @array, $new_value;
shift @array if @array > $max_length; # keep constant length
これはスペース効率に優れていますが、単純にリストを作成して実行するよりも遅くなる可能性があります。
splice @array, 0, -$max_length; # remove all but $max_length last elems
(新しい変数を割り当てずに) 配列の特定の部分のみにアクセスするには、スライスを使用します。
use List::Util qw/sum/;
my $last_24_sum = sum @array[-24 .. $#$array]; sum the last 24 elems
ハッシュを使用したいが、コンパイル時にすべての可能なフィールドを知っている場合は、フィールドの定数名を定義し、代わりに配列を使用できます。だからしないでください
my $hashref = { foo => $x, bar => $y }; # requires a lot of space
$hashref->{foo}; # slooow
しかし、する
use constant {
EL_FOO => 0, # make sure the integer range is continouus
EL_BAR => 1, # Perl doesn't have native enums
};
my $arrayref = [$x, $y];
$arrayref->[EL_FOO]; # faster!
代わりは。
深くネストされたデータを操作する場合、ネストされた参照をアクセスごとに再計算するのではなく、キャッシュすることで成果が得られることがあります。
# disputable
for my $i (...) {
for my $j (...)
do_something_with $x->[$i][$j][$_] for 1 .. 1e3;
}
}
# possibly better
for my $i (...) {
for my $j (...) {
my $aref = $x->[$i][$j];
do_something_with $aref->[$_] for 1 .. 1e3;
}
}