在我编写的 Scala 程序中,我有一个scala.collection.Map
将字符串映射到一些计算值(详细来说是Map[String, (Double, immutable.Map[String, Double], Double)]
- 我知道这很丑,应该(并且将会)被包裹起来)。现在,如果我这样做:
stats.map { case(c, (prior, pwc, denom)) => {
println(c)
...
}
}
大约需要 30 秒才能打印出大约 50 倍的值c
! The println
只是一个测试语句 - 我需要的实际计算甚至更慢(我在完全沉默 1 分钟后中止)。但是,如果我这样做:
stats.mapValues { case (prior, pwc, denom) => {
println(prior)
...
}
}
我没有遇到这些性能问题......任何人都可以解释为什么会发生这种情况吗?我是否没有遵循一些重要的 Scala 准则?
谢谢您的帮助!
Edit:
我进一步调查了这种行为。我的猜测是瓶颈来自于访问Map
数据结构。如果我执行以下操作,我会遇到相同的性能问题:
classes.foreach{c => {
println(c)
val ps = stats(c)
}
}
Here classes
is a List[String]
外部存储 Map 的键。无权访问stats(c)
不会发生性能损失。