[英]lazy val function vs def method
從外部 class 調用 function 時,如果有很多調用,什么會給我更好的性能, lazy val
function 或def
方法? 到目前為止,我的理解是:
def
方法-
lazy val
lambda 表達式 -
所以,似乎使用 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.