Julia数组理解内存使用情况

A.Y*_*iha 1 arrays memory-management list-comprehension julia

我正在使用数组解析来定义自定义类型数组的元素的感兴趣值.

sum([value.interest for value in ArrayofMyType if condition])
Run Code Online (Sandbox Code Playgroud)

该表达式本身处于迭代循环中.这意味着每个周期,这种理解都使用新的记忆.此外,每次条件可能对所得到的阵列施加不同的长度,并且在循环外定义具有固定长度的预定义阵列可能不是最佳方式.

每次循环运行时都会产生开销,我不知道如何提高效率并更好地利用内存.有没有人可以用这个指导我?理解在风格上很方便但我觉得在我的情况下并不是最有效的.

代码风格是:

for i in 1:MAX_ITER
    ### Some code above
    sum([value.interest for value in ArrayofMyType if condition])     
    ### Some code below
end
Run Code Online (Sandbox Code Playgroud)

tim*_*tim 7

您可以使用生成器表达式(只省略括号):

sum(value.interest for value in ArrayofMyType if condition) 
Run Code Online (Sandbox Code Playgroud)

这不会创建中间数组,而是创建类型的实例Generator.你可以做

g = (value.interest for value in ArrayofMyType if condition)
Run Code Online (Sandbox Code Playgroud)

在函数调用之外创建这样的对象.它实现了迭代器接口,特别是方法start,next,done,和一些额外的方法,如length,并且因此可以使用无处不在迭代器被接受.

如果一切都是类型稳定的,那么与手写循环相比的开销几乎是恒定的,对于较大的数组可忽略不计.否则,开销可能很大.

对于短数组,开销仍然很大,手写循环可能是更好的解决方案:

immutable A{T} x::T end

const a = [A(i) for i in 1:100]

mysum(a) = mysum(eltype(a), a)

function mysum{T}(::Type{A{T}}, a)
    sum = zero(T)
    @inbounds for i in eachindex(a)
        sum += a[i].x
    end
    return sum
end

using BenchmarkTools

@benchmark sum(e.x for e in $a)
@benchmark mysum($a)
Run Code Online (Sandbox Code Playgroud)

这给了我的电脑50nsvs.15ns

  • 不,它创建了一个类型为"Generator"的实例.您可以执行`g =(valueofinterest for ArrayofMyType,如果条件)`来获取对象.它实现了迭代器接口,例如函数`start`,`next`和`done`. (3认同)