簡體   English   中英

Scala集合轉換性能:單循環與多循環

[英]Scala collection transformation performance: single looping vs. multiple looping

當有一個集合並且您必須對其集合的所有元素執行兩個或更多操作時,哪個更快?

val f1: String => String  = _.reverse
val f2: String => String  = _.toUpperCase
val elements: Seq[String] = List("a", "b", "c")
  1. 重復多次並在一個循環上執行一項操作

    val result = elements.map(f1).map(f2)

    這種方法確實具有優點,即可以重用應用第一個函數后的結果。

  2. 迭代一次並一起對每個元素執行所有操作

    val result = elements.map(element => f2(f1(element)))

    要么

    val result = elements.map(element => f1.compose(f2)

這兩種方法之間在性能上有什么區別嗎? 如果可以,哪個更快?

事情就是這樣,集合的轉換或多或少是運行時O(N),*所有應用函數的運行時成本。 因此,我懷疑您在上面提出的第二組選擇是否會對運行時產生微小的影響。 您列出的第一個選項是一個不同的故事。 可以避免創建新的集合,因為這可能會導致開銷。 那就是“視圖”集合出現的地方(請參閱我發現的這個好例子)

在Scala中,“視圖”有什么作用?

如果您應用了幾次映射操作,則可以執行以下操作:

val result = elements.view.map(f1).map(f2).force

(最后強制執行,導致所有函數都進行評估)上面的第二組示例可能會稍快一些,但是如果您使用了很多此類或復雜的匿名函數,則“ view”選項可使您的代碼更具可讀性在映射中。

組合函數以生成單遍轉換可能會為您帶來一些性能,但是很快就會變得不可讀。 考慮使用視圖作為替代。 雖然這將創建中間集合:

val result = elements.map(f1).map(f2)

這將執行惰性評估,並將以與您相同的方式執行功能組合:

val result = elements.view.map(f1).map(f2)

請注意,結果類型將為SeqView因此您可能希望稍后使用toList將其轉換為list。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM