簡體   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