use*_*545 5 perl performance loops
以下子程序在我的计算机中需要12秒才能执行:
sub trans() {
$trans = "";
foreach $nuc (@array) {
foreach $k (keys %hash) {
if ($nuc eq $k) {
$w = $hash{$k};
$trans .= $w;
last;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码继续生成内容为$ trans的文件.正如我所说,这需要12秒.问题是我必须生成256个输出文件......这需要太长时间.....
任何优化它的想法?
Eev*_*vee 11
为什么循环遍历哈希中的每个键只是为了测试它是否等于已知值?
sub trans() {
$trans = "";
for my $nuc (@array) {
if (exists $hash{$nuc}) {
$trans .= $hash{$nuc};
}
}
return $trans;
}
Run Code Online (Sandbox Code Playgroud)
但那么......为什么还要费心去测试.
sub trans() {
$trans = "";
for my $nuc (@array) {
$trans .= $hash{$nuc} // "";
}
return $trans;
}
Run Code Online (Sandbox Code Playgroud)
谁还需要循环呢?
sub trans() {
return join '', map { $hash{$_} // '' } @array;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用哈希切片:
sub trans() {
return join '', @hash{@array};
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果@array包含的值不是现有键%hash并且已warnings启用,则会抱怨未初始化的值.(你做已经warnings启用了,不是吗?)根据您的数据的规则,这可能是一个错误(在这种情况下加入no warnings到sub会解决这个问题),或者一个特征.
尝试以下操作
sub trans() {
$trans = "";
foreach $nuc (@array) {
if ($hash{$nuc}) {
$w = $hash{$nuc};
$trans .= $w;
}
}
}
Run Code Online (Sandbox Code Playgroud)