2013-05-30 4 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) 
    } 
} 

첫 번째 버전은 초당 19.3 초가 소요됩니다. 차이점이 뭐야?부분적으로 적용된 기능 사용 성능 문제

편집 : 스칼라 버전 2.9.2 (자바 핫스팟 (TM) 64 비트 서버 VM, 자바 1.7.0_21) 두 번째 인 반면 첫 번째는

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

로 해석됩니다

답변

4

(x: Int) => ps.reverse.exists(x) 

다음은 차이점을 설명합니다. 두 번째 경우에는 각 시간을 역순으로해야하지만 첫 번째 경우에는 한 번만 되돌려 야합니다. 나는 이것이 각 경우에 (또는 그것이하는 경우에) 얻는 것임을 말하는 스펙에서 어느 부분인지 확신하지 못한다.

관련 문제