Jea*_*ean 93 arrays iteration perl
迭代Perl数组的哪个是最佳实现(在速度和内存使用方面)?有没有更好的方法?(@Array
不需要保留).
foreach (@Array)
{
SubRoutine($_);
}
Run Code Online (Sandbox Code Playgroud)
while($Element=shift(@Array))
{
SubRoutine($Element);
}
Run Code Online (Sandbox Code Playgroud)
while(scalar(@Array) !=0)
{
$Element=shift(@Array);
SubRoutine($Element);
}
Run Code Online (Sandbox Code Playgroud)
for my $i (0 .. $#Array)
{
SubRoutine($Array[$i]);
}
Run Code Online (Sandbox Code Playgroud)
map { SubRoutine($_) } @Array ;
Run Code Online (Sandbox Code Playgroud)
ike*_*ami 75
在速度方面:#1和#4,但在大多数情况下并不多.
您可以编写一个基准来确认,但我怀疑您会发现#1和#4稍快一些,因为迭代工作是在C而不是Perl中完成的,并且不会发生任何不必要的数组元素复制.($_
被混叠到在#1中的元素,但#2和#3上实际复制的标量从阵列).
#5可能类似.
在内存使用方面:除#5外,它们都是相同的.
for (@a)
是特殊的,以避免扁平化阵列.循环遍历数组的索引.
在可读性方面:#1.
在灵活性方面:#1 /#4和#5.
#2不支持false的元素.#2和#3具有破坏性.
Sin*_*nür 24
如果您只关心元素@Array
,请使用:
for my $el (@Array) {
# ...
}
Run Code Online (Sandbox Code Playgroud)
要么
如果指数重要,请使用:
for my $i (0 .. $#Array) {
# ...
}
Run Code Online (Sandbox Code Playgroud)
或者,从perl
5.12.1开始,您可以使用:
while (my ($i, $el) = each @Array) {
# ...
}
Run Code Online (Sandbox Code Playgroud)
如果你需要循环体中的元素及其索引, 我期待 运用 each
是最快的,但随后你将放弃与5.12.1之前的兼容性perl
.
在某些情况下,某些其他模式可能是合适的.
归档时间: |
|
查看次数: |
216785 次 |
最近记录: |