Perl数组元素过滤:grep与for循环的性能对比及优选方式
性能优先的话,选
grep单行写法准没错 嘿,从性能角度考量,绝对优先推荐用grep的单行实现,原因主要有这两点:
grep是Perl的内置核心函数,底层用C编写,执行时绕开了Perl解释器处理Perl级循环的额外开销。而你写的foreach循环是在Perl层面逐次迭代,每一轮循环都要触发解释器的变量处理、条件判断等逻辑,这些额外步骤在数组元素数量较大时,会累积出明显的性能差距。- 顺带提一句,
grep的写法还更简洁直观,一行代码就把“过滤数组元素”的意图说清楚了,可读性和维护性都比循环好。
哦对了,你示例里的判断条件有个小错误!筛选偶数应该用$_ % 2 == 0(用取模判断余数是否为0),而不是$_/2 eq 0——eq是字符串比较运算符,这里得用数值比较的==,而且除法判断的逻辑本身也不对(比如4/2是2,根本不等于0),得修正一下。
修正后的正确写法:
grep版本
my @array = (1, 2, 3, 4, 5, 6, 7, 8); my @filtered = grep { $_ % 2 == 0 } @array;
foreach循环版本
my @array = (1, 2, 3, 4, 5, 6, 7, 8); my @filtered; foreach (@array) { push @filtered, $_ if $_ % 2 == 0; }
哪怕修正后,grep的性能依然会比循环好,尤其是处理大规模数组的时候,这种差距会更显著。
内容的提问来源于stack exchange,提问作者vp8
相关产品推荐
相关产品推荐

