假设我有两个相当大的数组,a
和 b
。
我想要b=a+b
,但之后我真的不需要a
,更愿意保存内存,以避免交换。
我考虑过简单地使用:
b.unshift( *a.slice!(0..-1) )
但是上面的缺点是在过程完成之前仍然保留 a
的副本。另一种选择是:
while ! a.empty?() do
b.unshift( a.pop() )
end
虽然不优雅,甚至可能更慢(这是迭代,我不知道 *
运算符的工作速度有多快,也许它处于较低级别),这使中间内存占用量保持在最低限度。
还有更优雅的东西吗?
最佳答案
不能保证分配给 a
的内存会因为您删除了所有元素而被释放。大多数动态数组系统会随着数组大小的增加而进行分配,这是非常必要的,但在减小大小时会更加轻松。
最好的方法是执行 b += a
,让 a
超出范围,然后让垃圾收集器对其进行排序。
除非您可以生成一个具体的基准来表明您的复杂方法效果更好,否则它可能不会因为 splat 操作将创建需要收集的额外垃圾,否则您应该做最简单的事情。
关于arrays - 在 Ruby 中将数组破坏性地转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49406072/