Если производительность, что вы после этого, то это то, что вы хотите, как с точки зрения времени, и с точки зрения использования памяти (это похудел версия Seq.scan
от компилятора):
let scan z (source : seq<'T>) =
seq { let zref : ('T list ref) = ref z
yield !zref
use ie = source.GetEnumerator()
while ie.MoveNext() do
zref := ie.Current :: !zref
yield !zref }
let input = Seq.initInfinite (fun i -> sprintf "x%i" i)
let createSeqCustom s =
s
|> scan []
|> Seq.skip 1
> System.GC.Collect()
> let l = input |> createSeq |> Seq.take 2000 |> Seq.toArray
Real: 00:00:00.007, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
СРАВНЕНИЮ к следующему наивысшему ответу:
let createSeq s =
s
|> Seq.scan (fun x y -> x @ [y]) []
|> Seq.skip 1
> System.GC.Collect()
> let l2 = input |> createSeq |> Seq.take 2000 |> Seq.toArray
Real: 00:00:00.293, CPU: 00:00:00.296, GC gen0: 6, gen1: 4, gen2: 0
Важным отличием является сбор мусора. Эта реализация также будет обрабатывать большие последовательности (обратите внимание на 200.000 пунктов принимается):
> System.GC.Collect()
> let l = input |> createSeqCustom |> Seq.take 200000 |> Seq.toArray
Real: 00:00:00.406, CPU: 00:00:00.406, GC gen0: 11, gen1: 5, gen2: 0
В то время как другие реализации запустить из памяти на гораздо меньших ресурсах (обратите внимание на 20000 пунктов принимается):
> let l2 = input |> createSeq |> Seq.take 20000 |> Seq.toArray
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
Stopped due to error
спасибо все для ваших ответов :) очень полезно! – user3748224
Если один из ответов адекватно отвечает на ваш вопрос, вы должны отметить его как правильное (см. Маленькую галочку слева от ответа). – mydogisbox