我正在编写一个脚本,该脚本可生成多个大型数组哈希 (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/