假设我有两个相当大的数组,a
和b
。
我希望拥有b=a+b
,但事后我并不需要a
,而是宁愿保存内存,以避免交换。
我想过简单地使用:
b.unshift( *a.slice!(0..-1) )
但是上述方法的缺点是仍然保留a
的副本,直到程序结束。另一种选择是:
while ! a.empty?() do
b.unshift( a.pop() )
end
虽然不优雅,甚至可能更慢(这是迭代,我不知道*
运算符的运行速度有多快,也许它处于较低级别),这使中间内存占用空间保持最小。
有更优雅的东西吗?
答案 0 :(得分:2)
无法保证分配给a
的内存只是因为您删除了所有元素而被释放。大多数动态阵列系统都会随着阵列大小的增加而分配,这是一个很大的必要条件,但在减小尺寸时会更加放松。
最好的方法是执行b += a
,让a
超出范围,然后让垃圾收集器对其进行排序。
除非你能够产生一个具体的基准测试,表明你的复杂方法效果更好,但它可能不会因为splat操作会产生需要收集的额外垃圾,你应该做最简单的工作。
答案 1 :(得分:1)
有更优雅的东西吗?
同时使用unshift
和pop
:
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]