2
下面的perl子用於存儲散列數組。 要存儲的每個散列首先使用給定的鍵檢查唯一性,如果具有相同鍵值的陣列上存在散列,則不存儲它。這個perl子如何優化速度?
這個perl子如何優化速度?
使用例:
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, "[email protected]_." 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是不是我的,我一個Perl的初學者
'=='和'eq'檢查是否等同?我似乎記得一個用於數字比較,一個用於字符串?即05在數字上與5相同,但不是按字母順序。也許這與我的數據無關。 – Craig
NYTProf迴歸爲1.8s而不是4.6s,所以它肯定是更快的代碼... – Craig
@Craig我認爲你必須根據你的數據來決定哪個比較最好。如果你願意,你可以放回數字測試。例如:'return if($ node - > {$ uniq} =〜/^[0-9] + $ /和$ node - > {$ uniq} == $ rhash - > {$ uniq});'然而,那麼你需要注意可以包含非數字字符的數字,例如'12.20'或'FF'。 – TLP