什么是最有效的真的取决于。
- 哈希是无序的。他们可以通过字符串键在几乎恒定的时间内查找值。查找在计算上是昂贵的,并且至少比数组查找慢一个数量级。哈希的执行情况取决于“桶”的数量和键的数量。但是,对于所有非平凡的情况,哈希查找将比遍历数组来查找元素更快。哈希比数组需要更多空间。
- Perl 中的数组具有数组(随机访问)和双向链表(通过 push、pop、shift、unshift)的特性。它们易于使用,而且速度足够快。如果要添加/删除多个元素,请使用切片或
splice
函数。splice
是push
..的概括unshift
,并且比循环更快。
字符串可用于存储整数数组。这是非常有效的,但也非常有限(仅限整数)。
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
有很多用途)。
务实的程序员将对大多数顺序数据使用数组。List::Util
他还可以利用来自和的高效函数,List::MoreUtils
这些函数提供了sum
、和(为了速度而用 C 语言编写)之类的函数。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;
}
}