object E7 {
def next_prime(primes: List[Int]) = primes match {
case ps@(h :: t) => {
// Version 1
val rpq = ps.reverse.exists _
// Version 2
val rpq = ps.reverse.exists(_)
(Iterator.from(h + 1).find((v) => ! rpq(v % _ == 0)): @unchecked) match {
case Some(v) => v :: ps
}
}
case Nil => List(2)
}
val primes = Iterator.iterate(List[Int]())(next_prime)
def main(args: Array[String]) {
println(primes.drop(20001).next.head)
}
}
首版需要3.6秒才能完成,第二版需要19.3秒!有什么区别?
编辑:Scala版本2.9.2(Java HotSpot(TM)64位服务器VM,Java 1.7.0_21)
答案 0 :(得分:4)
第一个被解释为
{ val temp = ps.reverse; (x: Int) => temp.exists(x) }
而第二个被解释为
(x: Int) => ps.reverse.exists(x)
这解释了不同之处:你必须在第二种情况下每次反转,但在第一种情况下只需反转一次。我不确定在规范中哪里说这是你在每种情况下得到的(或者如果它)。