gpt4 book ai didi

julia - 组合不等长的向量

转载 作者:行者123 更新时间:2023-12-04 14:01:59 24 4
gpt4 key购买 nike

x = [1, 2, 3, 4]
y = [1, 2]

如果我希望能够对两个填入默认值的vector进行操作,有什么策略呢?

例如想要执行以下操作并隐式填充 0missing

x + y        # would like [2, 4, 3, 4] 

理想情况下,我希望以通用方式执行此操作,以便我可以对两者进行任意操作。

最佳答案

不管 Julia 是否有内置的东西来做这件事,请记住 Julia 很快。这意味着您可以编写代码来支持这种需求。

extend!(x, y::Vector, default=0) = extend!(x, length(y), default)
extend!(x, n::Int, default=0) = begin
while length(x) < n
push!(x, default)
end
x
end

然后当你有你所描述的代码时,你可以对称地扩展 xy:

x = [1, 2, 3, 4]
y = [1, 2]
extend!(x, y)
extend!(y, x)
x + y
==> [2, 4, 3, 4]

请注意,这会改变 y。在许多情况下,所需的长度将来自代码外部,并将应用于 xy。我也可以想象 0 通常是一个糟糕的默认值(即使它完全适合您的加法上下文。

下面的评论提出了一个有值(value)的观点,即您应该考虑使用 append! 而不是循环遍历 push!。事实上,如果您关心非常小的差异,最好像这样测量差异。我继续进行测试:

julia> using BenchmarkTools
julia> extend1(x, n) = begin
while length(x) < n
push!(x, 0)
end
x
end
julia> @btime begin
x = rand(10)
sum(x)
end
59.815 ns (1 allocation: 160 bytes)
5.037723569560573

julia> @btime begin
x = rand(10)
extend1(x, 1000)
sum(x)
end
7.281 μs (8 allocations: 20.33 KiB)
6.079832879992913
julia> x = rand(10)
julia> @btime begin
x = rand(10)
append!(x, zeros(990))
sum(x)
end
1.290 μs (3 allocations: 15.91 KiB)
3.688526541987817
julia>

在循环中推送原语快得要命,分配一个零向量以便我们可以使用 append! 稍微快一点。

但这里真正的教训是循环版本需要秒来附加近 1000 个值(多次重新分配数组)。一个接一个地附加 10 个值只需要 150 多纳秒(而且 append! 稍微快一些)。这快得令人眼花缭乱。从字面上看,在 R 或 Python 中什么都不做可能会比这花费更长的时间。

这种差异在某些情况下很重要,但在许多其他情况下是检测不到的。如果重要,请测量。如果没有,请做想到的最简单的事情,因为 Julia 会支持你(性能方面)。

进一步更新

从 Colin 的另一条评论中得到提示,这里是我们使用 append! 但没有分配列表的结果。相反,我们使用一个生成器……也就是说,一种数据结构,当被要求使用一个非常像列表的接口(interface)时,它会发明数据。结果比我上面显示的要好得多。

julia> @btime begin
x = rand(10)
append!(x, (0 for i in 1:990))
sum(x)
end
565.814 ns (2 allocations: 8.03 KiB)

请注意 0 for i in 1:990 两边的圆括号。

最后,科林是对的。如果我们可以避免相关的开销,使用 append! 会快得多。令人惊讶的是,基函数 Iterators.repeated(0, 990) 慢得多。

但是,无论如何,所有这些选项都非常快,而且所有这些选项都可能非常快,以至于这些细微差别都无关紧要。

Julia 很有趣!

关于julia - 组合不等长的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69711260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com