Julia 茱莉亚推!需要整个阵列的副本
查看推送代码!,指示数组增长到一个元素的大小。阵列是否在逻辑上增加了一个元素的大小,而底层存储只要大于或等于所需的存储元素就保持不变,并且在存储已满且无法容纳额外元素时,通过创建一个大得多的存储并将整个阵列复制到阵列中来增加?或者,是否必须在每次推送时重新创建阵列!手术Julia 茱莉亚推!需要整个阵列的副本,julia,Julia,查看推送代码!,指示数组增长到一个元素的大小。阵列是否在逻辑上增加了一个元素的大小,而底层存储只要大于或等于所需的存储元素就保持不变,并且在存储已满且无法容纳额外元素时,通过创建一个大得多的存储并将整个阵列复制到阵列中来增加?或者,是否必须在每次推送时重新创建阵列!手术 function push!(a::Array{T,1}, item) where T # convert first so we don't grow the array if the assignment won't
function push!(a::Array{T,1}, item) where T
# convert first so we don't grow the array if the assignment won't work
itemT = convert(T, item)
_growend!(a, 1)
a[end] = itemT
return a
end
Julia阵列以摊销成本的方式增长(目前的增长系数为2),参见,例如:做一些基准测试似乎在性能方面证实了这一点。也就是说,你能提供一份推荐信吗?这带来了另一个问题:与普通C数组相比,这种机制显然需要影响性能的绑定检查。你觉得怎么样?从调用的函数开始,然后再到这里的C实现。@BogumiłKamiński够公平的了。Will do:-)>这带来了另一个问题:与普通C数组相比,这种机制显然需要绑定检查,这会影响性能。你这是什么意思?C数组是不可增长的,因此您的意思必须与之不同。正如答案中所述,数组当前的增长因子为2,因此您只需要log2(N)重新分配(或拷贝)即可增长N个元素。另外,如果您大致知道需要多少空间,可以使用
sizehint代码>功能可最大限度地减少重新分配。