J'essaie d'utiliser SEQ.Cache avec une fonction que j'ai faite qui renvoie une séquence de nombres premiers jusqu'à un nombre N excluant le numéro 1. J'ai du mal à comprendre comment garder la séquence mise en cachette dans la portée mais Utilisez-le toujours dans ma définition.
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
3 Réponses :
Si, au lieu de définir une fonction, donnez aux nombres premiers que Je n'ai pas comparé la performance de cette méthode par rapport à la vôtre. P> p> SEQ.Cache code> cache un
IEnumerable
n code> vous souhaitez définir une séquence énorme infinie de nombres premiers, puis la mise en cache a plus de sens. Cela ressemblerait plus à ceci: p>
J'ai compris comment résoudre mon problème avec un pli, mais pas mon idée d'utiliser 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]
La performance est d'environ 3 fois mieux avec le pli à l'aide de l'ancienne version de septembre. Je vais vérifier à VS2010 plus tard aujourd'hui.
La performance dans VS2010 est 2 fois mieux avec le pli. Nice de savoir qu'il y avait une augmentation de la performance des séquences.
Avez-vous vu un coup d'oeil à Lazyliste? On dirait que c'est conçu pour résoudre le même problème. C'est dans Powerpack. P>