F# 시퀀스 캐시 사용을 올바르게 사용합니다
문제
나는 숫자 1을 제외한 숫자 n까지의 프라임 시퀀스를 반환하는 함수와 함께 seq.cache를 사용하려고 노력하고 있습니다. 캐시 된 시퀀스를 스코프로 유지하는 방법을 알아내는 데 어려움이 있습니다. 내 정의에서.
let rec primesNot1 n =
{2 .. n}
|> Seq.filter (fun i ->
(primesNot1 (i / 2) |> Seq.for_all (fun o -> i % o <> 0)))
|> Seq.append {2 .. 2}
|> Seq.cache
seq.cache를 사용하여 더 빨리 만들 수있는 방법에 대한 아이디어가 있습니까? 현재 스코프에서 계속 떨어지고 성능이 느려지고 있습니다.
해결책
Seq.cache
캐시 an IEnumerable<T>
시퀀스의 각 항목이 한 번만 계산되도록 인스턴스. 그러나 귀하의 경우, 당신은 함수에 의해 반환 된 시퀀스를 캐싱하고 있으며, 함수를 호출 할 때마다 당신은 새로운 캐시 된 시퀀스. 나는 캐싱이 당신이 그것을 설명했듯이 당신의 문제에 대한 올바른 접근이라고 생각하지 않습니다. 대신에 당신은 아마도 회고록을 조사해야합니다.
프라임을보다 적게 제공하는 함수를 정의하는 대신 n
무한 열거 가능한 프라임 시퀀스를 정의하고 캐싱이 더 의미가 있습니다. 그것은 이것처럼 보일 것입니다 :
let rec upFrom i =
seq {
yield i
yield! upFrom (i+1)
}
let rec primes =
seq {
yield 2
yield!
upFrom 3 |>
Seq.filter (fun p -> primes |> Seq.takeWhile (fun j -> j*j <= p) |> Seq.forall (fun j -> p % j <> 0))
}
|> Seq.cache
나는 당신과 비교 하여이 방법의 성능을 비교하지 않았습니다.
다른 팁
나는 내 문제를 접는 방법을 알아 냈지만 seq.cache를 사용한다는 생각은 아니었다.
let primesNot1 n =
{2 .. n}
|> Seq.fold (fun primes i ->
if primes |> Seq.for_all (fun o -> i % o <> 0) then
List.append primes [i]
else
primes) [2]
Lazylist를 살펴 보셨습니까? 동일한 문제를 해결하도록 설계된 것 같습니다. Powerpack에 있습니다.
제휴하지 않습니다 StackOverflow