我想鼓励你for在Julia中使用这种循环:
b = [i+1 for i in [1,2,3]]
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么,除了更紧凑的语法,这将导致更好的可读性.这些内联循环是否更有效地评估表达式?如果是,为什么?
这些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)
在大多数情况下,使用问题中的表单是性能和可读性的胜利.
至于@丹·盖茨的回答互补,在实践中,用理解的另一个优势是,我们并不需要明确地关心类型,例如在b = [i+1.1 for i in tmp]修真将始终1推导出相应eltype的b我们:
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和相应问题以获取更多详细信息。
| 归档时间: |
|
| 查看次数: |
1388 次 |
| 最近记录: |