刚刚我惊讶地发现 mapValues
会产生一个视图。这个后果在以下示例中展现:
case class thing(id: Int)
val rand = new java.util.Random
val distribution = Map(thing(0) -> 0.5, thing(1) -> 0.5)
val perturbed = distribution mapValues { _ + 0.1 * rand.nextGaussian }
val sumProbs = perturbed.map{_._2}.sum
val newDistribution = perturbed mapValues { _ / sumProbs }
我的想法是,我有一个分布,会受到一些随机扰动,然后我会重新归一化它。实际上,代码在原本的意图上失败了:因为mapValues
生成了一个view
,所以无论何时使用perturbed
,_ + 0.1 * rand.nextGaussian
都将被重新评估。
现在我正在做类似于distribution map { case (s, p) => (s, p + 0.1 * rand.nextGaussian) }
这样的事情,但那只是有点冗长。因此,这个问题的目的是:
- 提醒那些不知道这个事实的人。
- 寻找使
mapValues
输出view
的原因。 - 是否有其他方法可以产生具体的
Map
。 - 是否还有其他常用的集合方法会遇到这种陷阱。
谢谢。
mapValues
,这就是为什么有时候运行得如此缓慢的原因... - Kane