julia - 如何在 Julia 中初始化结构数组
问题描述
我想了解我应该放什么而不是xxxxx
用结构初始化一个 1000 项数组,其中结构a
从2000
到3000
(即,数组的索引 1 表示a
为2000
,数组的索引 2 表示a
为2001
,依此类推)并且b
总是零。
struct MyStruct
a
b
end
myArray = Vector{MyStruct}( xxxxx , 1000)
我知道我可以创建一个循环并单独分配值,我只是想知道 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.a
and的类型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
推荐阅读
- python - Plotnine(ggplot):绘图区域外的注释
- oracle - 如何在sqlplus中获取oracle错误信息的详细信息?
- javascript - 单击复制到剪贴板按钮时,页面滚动到底部
- node.js - Node.js 中的服务器端调度
- python - 布尔输入和输出问题
- javascript - 观察者javascript问题
- django - 将模型属性值发送给其他模型并以它的形式显示
- r - 为什么 sprintf 在 for 循环中不起作用?R中的错误?
- php - 在 symfony 4.4 的控制器中测试模拟服务
- php - Symfony 4 切换到生产模式时无法登录