【问题标题】:Looping through hash of arrays more efficiently更有效地循环遍历数组的哈希
【发布时间】:2013-04-03 18:15:46
【问题描述】:

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

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

【问题讨论】:

  • 你的基准测试告诉你什么?
  • 目前我有一个子程序,我正在使用嵌套的 for 循环(选项 1)循环一个大型 HoA。使用嵌套的 for 循环,子例程大约需要。运行 5-12 秒。我还没有尝试使用 while 循环遍历 HoA。
  • 这两个是不等价的。选项 2 不会打印数组的内容。
  • @Borodin 修复了它但是,我意识到我需要使用数组的每个元素作为键,所以我可能仍然需要使用嵌套循环。
  • 听起来你应该使用数据库

标签: performance perl optimization hash memory-efficient


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    使用each 可能会更清晰,而且速度可能会稍微快一些,但无论如何你都不会获得任何重要的东西。

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

    【讨论】:

    • 你能看看我之前问的问题吗?关于比较哈希的一个。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多