2011-08-09 111 views
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的初學者

回答

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; 
} 
+0

'=='和'eq'檢查是否等同?我似乎記得一個用於數字比較,一個用於字符串?即05在數字上與5相同,但不是按字母順序。也許這與我的數據無關。 – Craig

+0

NYTProf迴歸爲1.8s而不是4.6s,所以它肯定是更快的代碼... – Craig

+0

@Craig我認爲你必須根據你的數據來決定哪個比較最好。如果你願意,你可以放回數字測試。例如:'return if($ node - > {$ uniq} =〜/^[0-9] + $ /和$ node - > {$ uniq} == $ rhash - > {$ uniq});'然而,那麼你需要注意可以包含非數字字符的數字,例如'12.20'或'FF'。 – TLP