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

もう 1 つの方法は、ハッシュ スライスを使用することです。

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

@array既存のキーではない値が含まれてい%hashて、有効にしている場合、これは初期化されていない値について文句を言うことに注意してくださいwarnings。(有効にしていますwarningsね?) データのルールによっては、これはバグ (この場合は に追加no warningsするsubと解決されます) または機能のいずれかです。

于 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 に答える