首页 > 解决方案 > 如何在 Julia 中初始化结构数组

问题描述

我想了解我应该放什么而不是xxxxx用结构初始化一个 1000 项数组,其中结构a20003000(即,数组的索引 1 表示a2000,数组的索引 2 表示a2001,依此类推)并且b总是零。

struct MyStruct
    a
    b
end

myArray = Vector{MyStruct}( xxxxx , 1000)

我知道我可以创建一个循环并单独分配值,我只是想知道 Julia 中是否有更快的东西。

标签: julia

解决方案


只需在单个帖子中收集其他用户的答案和评论:

不,没有什么比 Julia 中的循环更快的了

与 Python 和 R 等其他脚本语言不同,Julia 中的循环速度很快。事实上,其他“矢量化”操作,如广播,是根据 Julia 循环本身实现的。因此,一个快速的解决方案可能是:

function initialize_vector(range::AbstractRange)
    v = Vector{MyStruct}(undef, length(range))
    @inbounds for i in eachindex(range)
        v[i] = MyStruct(range[i], 0)
    end
    return v
end

直播既快捷又方便

广播几乎或有时与循环一样快,并且通常可以更简洁和方便。在这种情况下,initialize_vector上面的函数可以写成:

initialize_vector(range::AbstractRange) = MyStruct.(range, 0)

基准测试表明,这两个功能在速度上几乎相同。

请记住在结构中键入字段以获得更快的代码

Julia 依靠准确的类型推断来创建快速、专业的代码。如果MyStruct.aand的类型MyStruct.b可以是任何类型,通常无法准确推断应该对MyStruct. 即使在这种情况下,编译器能够推断类型是Int,每个MyStruct都必须包含对堆分配Int的引用而不是堆栈分配的引用。因此,只需更改即可获得10 倍的加速

struct MyStruct
    a
    b
end

struct MyStruct
    a::Int
    b::Int
end

如果您想改变的类型Mystruct.a并且MyStruct.b能够改变,您可以创建一个参数MyStruct,如下所示:

struct MyStruct{T}
    a::T
    b::T
end

推荐阅读