Ao gerar Primes em F #, por que a "peneira de Erosthenes" é tão lenta nessa implementação específica?

IE,

O que eu estou fazendo errado aqui? Precisa fazer com listas, seqüências e matrizes e o modo como as limitações funcionam?

Então aqui está a configuração: Estou tentando gerar alguns primos. Vejo que há um bilhão de arquivos de texto de um bilhão de primos. A questão não é por que ... a questão é como os caras usando python calculando todos os primos abaixo de 1.000.000 em milissegundos emesta postagem... e o que estou fazendo de errado com o seguinte código F #?

let sieve_primes2 top_number = 
    let numbers = [ for i in 2 .. top_number do yield i ]
    let sieve (n:int list) = 
        match n with
        | [x] -> x,[]
        | hd :: tl -> hd, List.choose(fun x -> if x%hd = 0 then None else Some(x)) tl
        | _ -> failwith "Pernicious list error."
    let rec sieve_prime (p:int list) (n:int list) =  
        match (sieve n) with
        | i,[] -> i::p
        | i,n'  -> sieve_prime (i::p) n'
    sieve_prime [1;0] numbers 

Com o timer ligado no FSI, eu ganho 4,33 segundos de CPU para 100000 ... depois disso, tudo explode.

questionAnswers(4)

yourAnswerToTheQuestion