0

我有一个数组哈希。这是循环通过它的最有效和最快的方法。

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,哪一个会节省我的时间。

4

2 回答 2

2

据我了解,keys将预先构建所有哈希键的完整列表,这可能会导致大量内存用于大型哈希。我认为这是一个考虑点,因为你说你有一个巨大的 HoA。

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

我认为很难回答“keys比 快each?”这个问题。在不了解数据的情况下(并直接对其进行测试),但我认为回答“我应该使用keys还是each在这种情况下?”这个问题可能更容易。根据您的目标和“巨大的 HoA”的含义,我认为一种方法可能更有效并导致更好的性能,至少在内存方面。其他人可能对这个主题有不同的意见和经验,所以我会很感激任何反馈。

于 2013-04-04T15:46:06.663 回答
1

使用each可能会更清晰,也可能会稍微快一点,但无论你怎么做,你都不会获得任何重要的东西。

while (my ($key, $val) = each %HoA) {
    print "Articles in group $key are: ";
    foreach ( @$val )  {
        print "$_\n";
    }
}
于 2013-04-03T18:26:18.830 回答