9
votes

F # à l'aide du cache de séquence correctement

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


0 commentaires

3 Réponses :


11
votes

SEQ.Cache cache un IEnumerable instance de sorte que chaque élément de la séquence ne soit calculé qu'une seule fois. Dans votre cas, cependant, vous mettez en cache la séquence renvoyée par une fonction, et chaque fois que vous appelez la fonction, vous obtenez une séquence nouvelle mise en cache, qui ne vous fait pas bon. Je ne pense pas que la mise en cache est vraiment la bonne approche de votre problème que vous l'avez décrite; Au lieu de cela, vous devriez probablement examiner la mémoire de mémoisation.

Si, au lieu de définir une fonction, donnez aux nombres premiers que n 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: xxx

Je n'ai pas comparé la performance de cette méthode par rapport à la vôtre.


0 commentaires

2
votes

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]


2 commentaires

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.



2
votes

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.


0 commentaires