更有效地循环遍历数组的散列

时间:2013-04-03 18:15:46

标签: performance perl optimization hash memory-efficient

我有一个数组哈希。这是循环使用它的最有效和最快捷的方式。

my %h1 = (
  C1 => ['3','1','2'],
  C2 => ['6','2','4'],
  C3 => ['8', '1'],
 );

选项1

foreach my $key ( keys %HoA )  {
    print "Articles in group $key are: ";
    foreach ( @{$HoA{$key}} )  {
    print "$_\n";
    }
}

选项2

while( my ($k, $v) = each %HoA ) {
    print "Articles in group $k are: @$v\n";   
}

如果我循环通过一个巨大的HoA,哪一个可以节省我的时间。

2 个答案:

答案 0 :(得分:2)

据我所知,keys将预先构建所有散列键的完整列表,这可能导致大量内存被用于大型散列。我认为这是一个值得考虑的问题,因为你说你有一个巨大的HoA。

对我来说,一些主要的区别是有时候你想要一个按值排序的列表或数组元素的数量,我认为你不能控制each的键值对的顺序回报。因此,在您需要排序列表的情况下,我会使用keys。如果您的哈希值非常非常大并且您需要键和值但顺序并不重要,我会使用each因为它只返回两个元素的列表(您的键值对)。另一件需要考虑的是使用数据库,正如其他人所建议的那样,但这可能需要付费,具体取决于您的数据大小。

我认为很难回答“keyseach更快”的问题?不知道更多关于数据的信息(并直接测试),但我认为回答这个问题可能更容易“我应该在这种情况下使用keys还是each?”根据你的目标以及“巨大的HoA”意味着什么,我认为一种方法可能更有效并且可以产生更好的性能,至少在内存方面如此。其他人可能对此主题有不同的意见和经验,所以我很感激任何反馈。

答案 1 :(得分:1)

使用each可能更清晰,也许可能更快一些,但是你不会获得任何重要的东西。

while (my ($key, $val) = each %HoA) {
    print "Articles in group $key are: ";
    foreach ( @$val )  {
        print "$_\n";
    }
}