【问题标题】:How does type inference differ between constant and non-constant global variables?常量和非常量全局变量之间的类型推断有何不同?
【发布时间】:2016-02-13 02:45:51
【问题描述】:

来自朱莉娅docs on array comprehensions

以下示例计算当前的加权平均值 沿一维网格的元素及其左右邻居。 :

julia> const x = rand(8)
8-element Array{Float64,1}:
 0.843025
 0.869052
 0.365105
 0.699456
 0.977653
 0.994953
 0.41084
 0.809411

julia> [ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ]
6-element Array{Float64,1}:
 0.736559
 0.57468
 0.685417
 0.912429
 0.8446
 0.656511

注意

在上面的例子中,x 被声明为常量,因为类型推断 在 Julia 中,在非常量全局变量上效果不佳。

结果数组类型是从表达式中推断出来的;为了 显式控制类型,类型可以添加到 理解。例如,在上面的例子中,我们可以避免 将 x 声明为常量,并确保结果是类型 Float64 写法:

Float64[ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ]

结尾附近的注释是什么意思?也就是说,常量和非常量全局变量的类型推断有何不同?

【问题讨论】:

  • 如果你取出const,你最终会得到一个Any的6元素数组,而不是Float64。请注意,如果您在函数内移动代码,即使没有const,您确实会得到Float64 的数组。但是,我对类型推断行为的了解还不够,无法完全回答您的问题。
  • 参考:issue#8870

标签: julia


【解决方案1】:

我认为问题在于,如果 x 未声明为 const,那么 Julia 不知道该变量的类型是否会改变(因为它永远不会超出全局范围)。因此,Julia 需要假设 x 的类型为 Any

但是,如果 x 被声明为 const,则 Julia 可以放心地假设其类型不会改变,并且 Julia 可以根据该信息进行优化。

请注意,如果您不将 x 声明为 const,则列表推导式的返回类型将为 Array{Any,1}

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 2015-10-21
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多