在Ruby中破坏性地将数组拆分为数组

时间:2018-03-21 12:12:35

标签: arrays ruby memory

假设我有两个相当大的数组,ab

我希望拥有b=a+b,但事后我并不需要a,而是宁愿保存内存,以避免交换。

我想过简单地使用:

b.unshift( *a.slice!(0..-1) )

但是上述方法的缺点是仍然保留a的副本,直到程序结束。另一种选择是:

while ! a.empty?() do 
       b.unshift( a.pop() )
end

虽然不优雅,甚至可能更慢(这是迭代,我不知道*运算符的运行速度有多快,也许它处于较低级别),这使中间内存占用空间保持最小。

有更优雅的东西吗?

2 个答案:

答案 0 :(得分:2)

无法保证分配给a的内存只是因为您删除了所有元素而被释放。大多数动态阵列系统都会随着阵列大小的增加而分配,这是一个很大的必要条件,但在减小尺寸时会更加放松。

最好的方法是执行b += a,让a超出范围,然后让垃圾收集器对其进行排序。

除非你能够产生一个具体的基准测试,表明你的复杂方法效果更好,但它可能不会因为splat操作会产生需要收集的额外垃圾,你应该做最简单的工作。

答案 1 :(得分:1)

  

有更优雅的东西吗?

同时使用unshiftpop

a = [1,2,3]
b = [4,5,6]

b.unshift(*a.pop(a.size))

p a, b
# []
# [1, 2, 3, 4, 5, 6]

或者如果您不想使用*

a = [1,2,3]
b = [4,5,6]

b.unshift(a.pop(a.size)).flatten!

p a, b
# []
# [1, 2, 3, 4, 5, 6]