У меня есть большой массив (10+ миллионов объектов), который я хочу объединить в один объект (для простоты, предположим здесь строку) и запустить каждый элемент в массиве через некоторую обработку (абстрагируется функцией do_stuff
). Есть два естественных способа сделать это:Эффективность памяти по сравнению с уменьшением/введением в Ruby
memo = ""
big_array.each do |e|
memo << do_stuff(e)
end
memo
и
big_array.reduce("") do |memo, e|
memo + do_stuff(e)
end
уменьшения/впрыснуть синтаксис более эстетически привлекательным, но вопрос в том, что более памяти эффективным. Мы уже знаем, что each is marginally more time efficient than reduce, но как насчет памяти?
Я также не понимаю, как я мог бы использовать память памяти в Ruby, особенно на блоке кода, поэтому, если кто-то может предоставить некоторые указатели на это, я также буду признателен.
Я думаю, что это зависит от того, что такое «памятка». Здесь, в первом случае, строка мутируется, и вы не создаете новый экземпляр на каждой итерации, как во втором примере. –
В вашем втором примере вы также можете использовать '<<' вместо '+' (хотя 'each_with_object' был бы лучшим выбором тогда). В нынешней форме я почти уверен, что последнее намного хуже с точки зрения потребления памяти (особенно, если 'memo' имеет тенденцию к росту). – samuil