排序是否有助于Perl中grep的效率

itz*_*tzy 7 perl grep

我正在寻找有关Perl grep功能如何工作的一些细节.我这样做:

if ( grep{ $foo == $_ } @bar ) {
  some code;
}
Run Code Online (Sandbox Code Playgroud)

假设@bar很大(数十万个元素).对于我的数据,如果我排序@bar,则值$foo更可能出现在数组的开头附近而不是接近结尾.我想知道这是否有助于提高性能.

换句话说,使用上面的代码,确实grep按顺序移动@bar检查是否$foo == $_一旦发现任何值为真,然后立即退出?或者它会@bar在返回值之前检查每个元素吗?

ike*_*ami 10

grep 不会短路,所以元素的排序无关紧要.

当List :: MoreUtils first发生短路时,整个列表必须在调用之前放在堆栈上.

这将是最好的:

for (@bar) {
   if ($foo == $_) {
      some code;
      last;
   }
}
Run Code Online (Sandbox Code Playgroud)

更新:我最初迭代索引,因为它使用O(1)内存,但同样如此for (@bar)(与for (LIST)一般情况下相反),因为ysth提醒我.

  • 对于数组而言,不会将数组放在堆栈上 (2认同)

sid*_*yll 6

由于您的使用grep是在标量上下文中,因此它返回匹配元素的数量.为了计算这一点,Perl无论如何都必须访问每个元素,因此从这个角度来看,排序不太可能有助于提高性能.