我正在寻找有关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提醒我.