Performance 在scala中的理解能力表现

Performance 在scala中的理解能力表现,performance,scala,for-comprehension,Performance,Scala,For Comprehension,我有一个关于scala中理解的效率的问题 当perm是一个包含大约550个元素的列表时,下面的代码运行大约需要45秒 perm = some list for{ perm <- perms.withFilter(_.size > 0) wordList = somefunction(perm) //expensive operation, wordlist is a list of strings sentenceList = somefunction1(perm)

我有一个关于scala中理解的效率的问题

当perm是一个包含大约550个元素的列表时,下面的代码运行大约需要45秒

perm = some list
for{
   perm <- perms.withFilter(_.size > 0)
   wordList = somefunction(perm) //expensive operation, wordlist is a list of strings
   sentenceList = somefunction1(perm) //very expensive operation, sentenceList is a list of list of strings
   word <- wordList
   sentence <- sentenceList
} yield { word::sentence}
perm=一些列表
为了{
烫发(0)
wordList=somefunction(perm)//昂贵的操作,wordList是字符串列表
sentenceList=somefunction1(perm)//非常昂贵的操作,sentenceList是字符串列表的列表

word在您的第一个代码片段中,似乎您正在将烫发中的每个项目与单词列表中的每个项目进行“循环”;实际上,这是一个笛卡尔积

然而,在您的第二个代码片段中,您只是用一个“单词”来“循环”perm中的每个项目,所以我认为这样会快得多


我似乎无法计算出变量的全部类型,因此很难完全解释。

让我们从两个方面来理解:

1.)

(二)


在第一种情况下,每次都会执行两个昂贵的函数。在第二种情况下,当
somefunction(perm)
返回空结果时,
somefunction1(perm)
将永远不会执行。

wordlist是字符串列表,senetenceList是字符串列表。谢谢你的回答。我明白你的意思。我有一个关于脱糖过程的后续问题。为什么第一个语句写为
perms.withFilter(u.size>0)。flatMap{}
而不是
perms.withFilter(u.size>0).foreach{}
foreach
返回
Unit
,因此您的结果将丢失。啊,我明白了。下面关于{x::y::z}}}
的理解
也是如此?好的,我再次阅读了scala手册并理解了。谢谢你的帮助。
perm = some list
for{
   perm <- perms.withFilter(_.size > 0)
   word <- somefunction(perm) //expensive operation
   sentence <- somefunction1(perm) //very expensive operation
} yield { word::sentence}
perms.withFilter(_.size > 0).flatMap { perm =>
  val wordList = somefunction(perm) //expensive operation
  val sentenceList = somefunction1(perm) //very expensive operation
  wordList.flatMap { word =>
    sentenceList.map { sentence =>
      word::sentence
    }
  }
}
perms.withFilter(_.size > 0).flatMap { perm =>
  somefunction(perm).flatMap { word =>
    somefunction1(perm).map { sentence =>
      word :: sentence
    }
  }
}