我希望这段代码尽可能快地运行。遍历对象列表并更改其字段或使用它们计算某些变量的最有效方法是什么?
这是我的代码:

mutable struct typeA
    a::Float64
end

mutable struct typeB
    b::Float64
end

mutable struct typeC
    c::Float64
end

types = Union{typeA, typeB, typeC}
function change(n::Int64, list::Array{types, 1})
    for i = 1:n
        j = rand(1:3)
        chosen = list[j]
        u = rand()
        if typeof(chosen) == typeA
            if u < chosen.a
                chosen.a = u
            end
        elseif typeof(chosen) == typeB
            if u < chosen.b
                chosen.b = u
            end
        elseif typeof(chosen) == typeC
            if u > chosen.c
                chosen.c = u
            end
        end
    end
    list
end

list = Union{types}[typeA(0.7), typeB(0.5), typeC(0.9)]
@time change(10000, list)


结果如下:


0.072776秒(85.81 k分配:4.694 MiB)


并第二次:


0.001378秒(4个分配:160字节)

最佳答案

我知道您想加快内循环部分的速度(不更改一般逻辑)。如果是这种情况,则在typeof(chosen) == typeAtypeof(chosen) === typeA子句中将chosen isa typeA更改为typeBtypeC(对于ifelseif相同),您应该看到3倍的加速。

关于optimization - 如何有效地遍历julia中的对象列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58486448/

10-10 06:38