在Julia中内联循环

riv*_*ell 4 for-loop julia

我想鼓励你for在Julia中使用这种循环:

b = [i+1 for i in [1,2,3]]
Run Code Online (Sandbox Code Playgroud)

但我想知道为什么,除了更紧凑的语法,这将导致更好的可读性.这些内联循环是否更有效地评估表达式?如果是,为什么?

Dan*_*etz 5

这些for循环称为数组理解.它们是一种简单的符号,用于分配数组然后根据某些计算为每个元​​素填充一个数组的常见编程模式.

如果正确完成(使用@inbounds删除不必要的边界检查),可能会在没有理解的情况下执行此操作.对于问题中的示例,以下代码执行相同的操作:

let tmp = [1,2,3], len = length(tmp)
    b = Vector{Int}(len)
    @inbounds for (n,i) in enumerate(tmp)
        b[n] = i+1
    end
    b
end
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,使用问题中的表单是性能和可读性的胜利.

  • 另一种形式是矢量广播,虽然在这种情况下看起来并不那么好看,但看起来非常清楚:`add1(x)= x + 1; add1.(1:3)`(注意函数和括号之间的点). (2认同)

Gni*_*muc 5

至于@丹·盖茨的回答互补,在实践中,用理解的另一个优势是,我们并不需要明确地关心类型,例如在b = [i+1.1 for i in tmp]修真将始终1推导出相应eltypeb我们:

julia> [i+1 for i in [1,2,3]]
3-element Array{Int64,1}:
 2
 3
 4

julia> b = [i+1.1 for i in [1,2,3]]
3-element Array{Float64,1}:
 2.1
 3.1
 4.1
Run Code Online (Sandbox Code Playgroud)

但是,在使用常见的 for 循环时,我们需要仔细初始化b(如@Dan Getz 的回答中的那个:)b = Vector{Int}(len),这意味着我们需要自己显式地进行类型推断。是的,Julia 是一种讨论类型的动态语言,即使在一些复杂的情况下也不是很难确定这些类型,但我们只是不费心。


1. 请注意,在 Juliav0.5 中,当 Julia 无法在全局范围内正确进行推导类型推断时,这实际上是一个陷阱。但现在已经修复,请参阅此 PR和相应问题以获取更多详细信息。