我想知道我应该怎么放的,而不是xxxxx
有1000个项目阵列结构初始化,其中a
从去2000
到3000
(即数组手段的指标1a
是2000
,数组手段的指标2a
是2001
,等等),并b
始终零。
struct MyStruct
a
b
end
myArray = Vector{MyStruct}( xxxxx , 1000)
我知道我可以进行循环并单独分配值,我只是想知道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.a
和MyStruct.b
可以是任何东西,它通常是无法推断到底是什么样的操作应在执行MyStruct
。即使在这种情况下,编译器也可以推断类型为Int
,每个类型都MyStruct
必须包含对堆分配的Int
s的引用,而不是堆栈分配的。因此,只需更改即可获得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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句