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)
Таким образом, похоже, что за пределами определенного размера delete_if
немного быстрее. time
определяется как:
def time(&block)
puts Benchmark.measure(&block)
end
Числа представляют пользователю процессорного времени, время система CPU, сумма пользователей и система CPU раз, и прошедшее в режиме реального времени, соответственно. Вы можете найти here объяснение их значений. Обратите внимание, что, как и в каждом тестировании, YMMV, и вы должны тестировать свои конкретные рабочие процессы, а не мой надуманный пример удаления чисел, кратных 5.
@rid so does 'delete_if' –
Разве вы не пробовали читать документация? Это довольно ясно: ['Hash # reject!'] (Http://www.ruby-doc.org/core-2.0.0/Hash.html#method-i-reject-21) и ['Array #reject! '] (http://www.ruby-doc.org/core-2.0.0/Array.html#method-i-reject-21). – toro2k