5

以下子程序在我的计算机中执行需要 12 秒:

sub trans() {   
    $trans = "";
    foreach $nuc (@array) {
        foreach $k (keys %hash) {
            if ($nuc eq $k) {
                $w = $hash{$k};
                $trans .= $w;
                last;
            }
        }
    }
}

代码继续生成内容为 $trans 的文件。正如我所说,这需要 12 秒。问题是我必须生成256个输出文件……而且时间太长……

有优化它的想法吗?

4

3 回答 3

11

为什么要遍历散列中的每个键来测试它是否等于已知值?

sub trans() {   
    $trans = "";
    for my $nuc (@array) {
        if (exists $hash{$nuc}) {
            $trans .= $hash{$nuc};
        }
    }
    return $trans;
}

但是……为什么还要麻烦测试呢。

sub trans() {   
    $trans = "";
    for my $nuc (@array) {
        $trans .= $hash{$nuc} // "";
    }
    return $trans;
}

谁需要循环呢?

sub trans() {   
    return join '', map { $hash{$_} // '' } @array;
}
于 2013-11-07T08:30:31.430 回答
6

另一种方法是使用哈希切片:

sub trans() {   
  return join '', @hash{@array};
}

@array请注意,如果包含的值不是现有的键%hash并且您已warnings启用,这将抱怨未初始化的值。(您确实启用了warnings,不是吗?)根据您的数据规则,这可能是错误(在这种情况下添加no warningssub将解决它)或功能。

于 2013-11-07T08:54:25.777 回答
4

尝试以下

sub trans() {   
    $trans = "";
    foreach $nuc (@array) {
            if ($hash{$nuc}) {
                $w = $hash{$nuc};
                $trans .= $w;
            }

    }
}
于 2013-11-07T08:29:46.917 回答