以下perl sub用于存储哈希数组。 首先使用给定密钥检查要存储的每个哈希的唯一性,如果数组上存在具有相同键值的哈希,则不存储该哈希。
这个perl sub如何针对速度进行优化?
使用示例:
my @members;
...
$member= {};
$hash->{'name'}='James';
hpush('name', \@members,$member);
子:
sub hpush {
# push a set of key value pairs onto an array as a hash, if the key doesn't already exist
if (@_ != 3) {
print STDERR "hpush requires 3 args, ".@_." given\n";
return;
}
my $uniq = shift;
my $rarray = shift;
my $rhash = shift;
my $hash = ();
#print "\nHash:\n";
for my $key ( keys %{$rhash} ) {
my $valuea = $rhash->{$key};
#print "key: $key\n";
#print "key=>value: $key => $valuea\n";
$hash->{ $key} = $valuea;
}
#print "\nCurrent Array:\n";
for my $node (@{$rarray}) {
#print "node: $node \n";
for my $key ( keys %{$node} ) {
my $valueb = $node->{$key};
#print "key=>value: $key => $valueb\n";
if ($key eq $uniq) {
#print "key=>value: $key => $valueb\n";
if (($valueb =~ m/^[0-9]+$/) && ($hash->{$key} == $valueb)) {
#print "Not pushing i $key -> $valueb\n";
return;
} elsif ($hash->{$key} eq $valueb) {
#print "Not pushing s $key -> $valueb\n";
return;
}
}
}
}
push @{$rarray}, $hash;
#print "Pushed\n";
}
请注意,perl不是我的,我是初学者
答案 0 :(得分:10)
这段代码相当......效率不高。首先,由于某种原因,它会将$rhash
复制到$hash
,并带有for循环。然后它循环遍历散列键,而不是简单地使用它正在寻找的散列键。然后它会进行两次等效检查,显然是一些尝试将数字与非数字区分开来并选择适当的检查(==
或eq
)。这都是不必要的。
以下代码应大致相同。我已经把它修剪得很难了。这应该尽可能快地得到它。
use strict;
use warnings;
hpush('name', \@members,$member);
sub hpush {
my ($uniq, $rarray, $rhash) = @_;
for my $node (@{$rarray}) {
if (exists $node->{$uniq}) {
return if ($node->{$uniq} eq $rhash->{$uniq});
}
}
push @{$rarray}, $rhash;
}