2013-05-30 13 views
5
object E7 { 
    def next_prime(primes: List[Int]) = primes match { 
    case [email protected](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) 
    } 
} 

Erste Version dauert 3.6s, zweite - 19.3s abzuschließen! Was ist der Unterschied?Mit teilweise angewandte Funktionen, Leistungsproblem

Edit: Scala Version 2.9.2 (Java HotSpot (TM) 64-Bit Server VM, Java 1.7.0_21)

Antwort

4

Die erste interpretiert wird als

{ val temp = ps.reverse; (x: Int) => temp.exists(x) } 

, während der zweite ist interpretiert als

Dies erklärt den Unterschied: Sie müssen jedes Mal im zweiten Fall, aber nur einmal im ersten Fall umkehren. Ich bin mir nicht sicher, wo in der Spezifikation steht, dass es das ist, was man in jedem Fall bekommt (oder wenn es das tut).