复制!并在Julia中切片

问题描述 投票:0回答:1

我在Julia中实现合并排序作为练习,注意到在使用 抄袭! 和传统的价值分配方式 切片 评论位)。谁能解释一下这个区别源于什么?

我在MergeSort中的合并函数

function myMerge(left, right)
    l = 1
    r = 1
    k = length(left) + length(right)
    result = zeros(k)
    for i in 1:k
        if left[l] <= right[r]
            result[i] = left[l]
            l += 1
            if l > length(left)
                #result[i+1:end] = right[r:end] # <-------- this is slower and uses more memory
                copy!(result, i+1, right, r)  # <-------- this is faster
                return result
            end
        else
            result[i] = right[r]
            r += 1
            if r > length(right)
                #result[i+1:end] = left[l:end]# <-------- this is slower and uses more memory 
                copy!(result, i+1, left, l)  #   <-------- this is faster
                return result
            end
        end
    end
    return result
end
performance julia
1个回答
3
投票

当然,。 right[r:end] 是分配,因为分片会创建一个副本。 你可以用视图代替。

result[i+1:end] .= @view right[r:end]

从微观优化的角度来说: copy! (其实你的意思是 copyto!BTW?)还可以更好一些,因为虽然创建视图是在恒定的时间空间中工作,但还是有一个小的开销,可能无法避免。

© www.soinside.com 2019 - 2024. All rights reserved.