Ruby 中每个与 reduce/inject 的内存效率

Posted

技术标签:

【中文标题】Ruby 中每个与 reduce/inject 的内存效率【英文标题】:Memory efficiency of each versus reduce/inject in Ruby 【发布时间】:2013-04-03 16:07:21 【问题描述】:

我有一个大数组(10+ 百万个对象),我想将它组合成一个对象(为简单起见,我们假设这里是一个字符串)并通过一些处理运行数组中的每个元素(由函数 @987654322 抽象@)。有两种自然的方法可以做到这一点:

memo = ""
big_array.each do |e|
  memo << do_stuff(e)
end
memo

big_array.reduce("") do |memo, e|
  memo + do_stuff(e)
end

reduce/inject 语法在美学上更具吸引力,但问题是哪个更内存 效率。我们已经知道each is marginally more time efficient than reduce,但是内存呢?

我也不清楚如何分析 Ruby 中的内存使用情况,尤其是仅在一段代码上,所以如果有人能提供一些指针,我也将不胜感激。

【问题讨论】:

我认为这很大程度上取决于memo 是什么。在这里,在第一种情况下,字符串发生了变异,并且您不会像在第二个示例中那样在每次迭代中创建一个新实例。 在第二个示例中,您也可以使用&lt;&lt; 而不是+(尽管each_with_object 会是更好的选择)。在目前的情况下,我很确定后者在内存消耗方面要差得多(特别是如果memo 趋于变大)。 【参考方案1】:

我很确定使用 map reduce(如您的示例中所写)您每次都在创建一个新字符串 +)。

使用&lt;&lt; 您正在修改原始字符串。这应该会更好,因为会触发更少的 GC 周期。

您提到您使用字符串作为示例;所以很难回答你真正的问题。

【讨论】:

以上是关于Ruby 中每个与 reduce/inject 的内存效率的主要内容,如果未能解决你的问题,请参考以下文章

遍历一个目录中的每个文件

如何在 ruby​​ on rails 中使每个 user_id 的列数据唯一

找出每个循环中的当前索引(Ruby)[重复]

Ruby - 遍历数组中的每个字符串并删除重复的字符

为 Ruby 模块中的每个方法调用执行代码

ruby中各种变量范围之间的区别