繁体   English   中英

惰性 val function 与 def 方法

[英]lazy val function vs def method

从外部 class 调用 function 时,如果有很多调用,什么会给我更好的性能, lazy val function 或def方法? 到目前为止,我的理解是:

def方法-

  1. 定义并绑定到 class,需要在“对象”中声明才能被称为 java static 样式。
  2. 按名称调用,仅在访问时评估,每次访问时评估。

lazy val lambda 表达式 -

  1. 绑定到 object Function1/2...22
  2. 按值调用,第一次评估仅访问和评估一次。
  3. 实际上 def apply 方法绑定到 class。

所以,似乎使用 lazy val 会减少每次评估 function 的需要,它应该是首选吗?

当我为 Spark 代码生成 UDF 时,我遇到了这个问题,我试图了解哪种方法更好。

object sql {
  def emptyStringToNull(str: String): Option[String] = {
    Option(str).getOrElse("").trim match {
      case "" => None
      case "[]" => None
      case "null" => None
      case _ => Some(str.trim)
    }
  }

  def udfEmptyStringToNull: UserDefinedFunction = udf(emptyStringToNull _)

  def repairColumn_method(dataFrame: DataFrame, colName: String): DataFrame = {
    dataFrame.withColumn(colName, udfEmptyStringToNull(col(colName)))
  }

  lazy val repairColumn_fun: (DataFrame, String) => DataFrame = { (df,colName) =>
    df.withColumn(colName, udfEmptyStringToNull(col(colName)))
  }
}

在这种特定情况下,您无需使用lazy val 当您将 function 分配给lazy val时,它的结果不会像您认为的那样被记忆。 由于 function 本身是一个普通的 function 字面量,而不是昂贵计算的结果(不管它内部发生了什么),所以让它变得懒惰是没有用的。 它所做的只是在访问和调用它时增加开销。 一个简单的val会更好,但最好让它成为一个合适的方法。

如果你想要记忆,请参阅Scala 中是否有通用的记忆方法? 反而。

忽略你的具体例子,如果有问题的def没有采用任何 arguments 并且它和lazy val都是简单的值,计算起来很昂贵,如果你要多次调用它,我会用 go 和lazy val避免一遍又一遍地计算它。

如果它们是计算成本非常低的值并且您不会多次调用它,或者如果它们的计算成本很高但您只打算调用它们一次,那么我会用def代替 go。 如果您改用lazy val ,则不会有太大区别,但它会避免创建几个字段。

如果它们的计算成本有点低,但它们被调用了很多次,那么使用lazy val可能会更好,因为它们会被缓存。 但是,在查看此类微优化之前,您可能希望查看整体设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM