Now*_*ker 40
reject - 创建一个没有匹配的元素的新数组并返回新数组delete_if- 删除与当前数组匹配的元素并返回该数组reject!- 删除与当前数组匹配的元素.如果某些内容被拒绝,或者nil什么都没有,则返回数组.tl;dr:delete_if似乎稍微快一点。但是,正如其他答案中所指出的,选择方法的主要考虑因素是返回值的差异。
既然你澄清了你的问题是关于效率的,我做了一些测试:
> time { (1..100000).to_a.reject!{ |n| n % 5 == 0 } }
0.390000 0.000000 0.390000 ( 0.394596)
> time { (1..100000).to_a.delete_if{ |n| n % 5 == 0 } }
0.400000 0.000000 0.400000 ( 0.399122)
> time { (1..200000).to_a.reject!{ |n| n % 5 == 0 } }
1.650000 0.000000 1.650000 ( 1.657927)
> time { (1..200000).to_a.delete_if{ |n| n % 5 == 0 } }
1.630000 0.010000 1.640000 ( 1.637719)
> time { (1..300000).to_a.reject!{ |n| n % 5 == 0 } }
3.700000 0.000000 3.700000 ( 3.717206)
> time { (1..300000).to_a.delete_if{ |n| n % 5 == 0 } }
3.660000 0.000000 3.660000 ( 3.686213)
> time { (1..400000).to_a.reject!{ |n| n % 5 == 0 } }
7.320000 0.020000 7.340000 ( 7.361767)
> time { (1..400000).to_a.delete_if{ |n| n % 5 == 0 } }
7.190000 0.020000 7.210000 ( 7.239549)
Run Code Online (Sandbox Code Playgroud)
所以,看起来超过一定大小delete_if会稍微快一些。
time定义为:
def time(&block)
puts Benchmark.measure(&block)
end
Run Code Online (Sandbox Code Playgroud)
这些数字分别代表用户 CPU 时间、系统 CPU 时间、用户和系统 CPU 时间的总和以及经过的实时时间。您可以在此处找到对它们含义的解释。请注意,就像在每个基准测试中一样,YMMV,您应该测试您的特定工作流程,而不是我人为的删除 5 倍数数字的示例。