arrays - 使用哈希引用的最佳方法是什么?

标签 arrays performance perl hash reference

我正在编写一个脚本,该脚本可生成多个大型数组哈希 (HoAs) 数据结构。我正在尝试优化我的脚本,因为目前它需要相当长的时间才能运行。

我做了一些基准测试。我已经设法使脚本执行大约。通过利用数组引用并直接使用 @_ 而不是将其复制到变量中来减少子例程调用开销,速度提高了 3.5 倍。我还删除了不必要的子例程和多余的变量声明。尽管有这些改进,我还是想让代码运行得更快。

在脚本开始时,我解析一个大文件以生成两个 HoA 数据结构。 关于哈希引用的这些方法中哪一种是最可行和最有效的? HoA 看起来像这样:

%HoA = (
    'C1' =>  ['1', '3', '3', '3'],
    'C2' => ['3','2'],
    'C3' => ['1','3','3','4','5','5'],
    'C4'  => ['3','3','4'],
    'C5' => ['1'],
);

选项 1

在解析文件时生成 HoAs(见下文)。最后将数组的哈希放入哈希引用中。

my $hash_ref = \%HoA;

选项 2

解析文件,使 HoA 中的每个键都有一个指向 array_ref 的值。最后将数组的哈希放入哈希引用中。

==============

我觉得选项 2 是一个很好的方法,但我该怎么做?

这是我目前正在做的事情。

use strict; use warnings;
open(F1, "file.txt") or die $!;
my %HoA = ();
    while (<F1>){
    $_=~ s/\r//;
    chomp;
    my @cols = split(/\t/, $_);

    push( @{$HoA{$cols[0]}}, @cols[1..$#cols]);
 }
close F1;

我需要一个高效的数据结构来帮助我快速查找值和键。另外,我需要能够尽可能高效地将键值(数组)、键和 HoA 本身多次传递到子例程中。

最佳答案

  • 不要使用全局变量,包括文件句柄。
  • 您声明了 %HoA 但从未使用过。
  • 您声明了 $HoA_ref 但从未使用过它。
  • 您使用了 $HoA 而没有声明它。始终使用 use strict;使用警告;
  • 为什么创建一个不需要的引用并最终多次取消引用它?
  • 没有理由将空列表分配给您刚刚创建的哈希。 我的 %HoA = (); 很愚蠢。
  • 不妨将 s///chomp 结合起来;
  • 不需要时可以省略 $_,或者使用有意义的变量名称。

上述所有内容和其他一些改进都是为了获得:

use strict;
use warnings;

open(my $fh, '<', 'file.txt') or die $!;

my %HoA;
while (<$fh>){
    s/\r?\n\z//;
    my ($key, @cols) = split /\t/;
    push @{ $HoA{$key} }, @cols;
}

关于arrays - 使用哈希引用的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15738320/

相关文章:

c++ - 我可以使用与静态数组具有相同功能的 vector 吗?

c - C语言用二进制文件保存和读取结构体数组

html - div容器贵吗?

perl - 从嵌套哈希中查找值

c - 将二维数组映射到一维数组

c - 指向结构数组的指针 - 解释

php - 计算欧拉计划的主要因素

java - 性能指标: Java vs JavaCard

perl - 我如何结合 Catalyst 和 ngettext?

python - 是否有 Perl 模块 Term::VT102 的 Python 等效项?