Optimization 如何在julia中高效地迭代对象列表?

Optimization 如何在julia中高效地迭代对象列表?,optimization,julia,Optimization,Julia,我希望这段代码尽可能快地运行。迭代对象列表并更改其字段或使用它们计算某些变量的最有效方法是什么? 这是我的密码: 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::Arr

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

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)
可变结构类型A
a::浮动64
结束
可变结构类型B
b::浮动64
结束
可变结构类型
c::浮动64
结束
类型=联合{typeA,typeB,typeC}
函数更改(n::Int64,list::Array{types,1})
对于i=1:n
j=兰特(1:3)
选择=列表[j]
u=rand()
如果typeof(已选择)=typeA
如果你选择了
a=u
结束
elseif typeof(所选)=类型B
如果uc
c=u
结束
结束
结束
列表
结束
list=Union{types}[typeA(0.7)、typeB(0.5)、typeC(0.9)]
@时间变化(10000,列表)
结果如下:

0.072776秒(85.81 k分配:4.694 MiB)

第二次:

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


我知道您希望加速内环部分(而不改变一般逻辑)。如果是这种情况,则将
typeof(selected)=typeA
更改为
typeof(selected)==typeA
selected isa typeA
(对于
typeB
typeC
也一样)在
if
elseif
子句中,您应该会看到大约3倍的加速。

在本例中,我会选择多次调度:

change!(x::typeA, u) = if u < x.a; x.a = u; end
change!(x::typeB, u) = if u < x.b; x.b = u; end
change!(x::typeC, u) = if u > x.c; x.c = u; end

function change(n, list)
    for i = 1:n
        j = rand(1:3)
        chosen = list[j]
        u = rand()
        change!(chosen, u)
    end
    list
end
改变!(x::typeA,u)=如果ux.c;x、 c=u;结束
功能更改(n,列表)
对于i=1:n
j=兰特(1:3)
选择=列表[j]
u=rand()
改变(美国)
结束
列表
结束
这比上一个答案稍有改进。此外,我还建议使用它来进行性能基准测试。通过
@b时间更改(10000美元列表)
我得到

  • 615.299μs(0分配:0字节)
    用于原始代码
  • 198.800μs(0分配:0字节)
    替换
    ==
  • 193.601μs(0分配:0字节)
    具有多个分派实现

for循环如何?这段代码只是一个例子。我正在做一个项目,我需要加快访问和改变结构领域。我需要大约10倍的加速。循环速度很快。您可以挤出一些性能,但是如果您真的想显著提高性能,那么可以分别采样您希望在
list[1]
list[2]
list[2]
上运行操作的次数,并分别执行,因为您现在应该避免的主要成本是
j=rand(1:3)
。为什么这里的加速比是原来的3倍?在进行类型比较时,我们是否应该始终选择
===
?如果将行if-typeof(selected)==typeA替换为if-selected==typeA,则会产生大约5倍的加速效果@kdheepak
=
是一个可以扩展的通用函数,而
isa
==
是更简单的内部结构,无法更改。在大多数情况下,不会有性能差异,
==
正是因为它允许定制的平等概念而被首选。但是在比较类型时,最好使用显式类型谓词(
isa
是否总是最快的方法?我的意思是在每个代码和每个函数中。