F#序列,列表和数组

时间:2019-07-15 23:39:59

标签: f# seq

假设我有一个'a类型的元素列表,即;

let mylist: 'a list = ...

和类型'a -> 'b的函数f;

let f: 'a -> 'b = ...

现在,我想使用fmylist转换为'b array

以下内容:

mylist |> List.map f |> Array.ofList

从性能和内存方面进行了以下改进:

mylist |> List.toSeq |> Seq.map f |> Array.ofSeq

1 个答案:

答案 0 :(得分:0)

答案取决于您的用例,即myList有多大?但是,通常,F#中的Seq速度很慢,并且浪费内存。幸运的是,对于大多数时间而言,这并不重要,因为我们通常只需要避免“真正糟糕的表现”,而“中等表现”通常就足够了。

我没有衡量(羞耻),但是根据我的经验,在大多数情况下,这要比OP的示例要好

mylist |> Array.ofList |> Array.map f

尽快从列表转换为数组,然后映射数组(数组用于.NET中效率更高的结构之一)。

在一些罕见的情况下,存储中间数组值会导致内存被交换到磁盘,我想使用Seq可能会有所帮助,但是在这些情况下,为什么我们要使用List<_>,因为这很浪费与Array<_>相比具有更大的内存(除非我们可以使用尾部重用)?

.NET中的某些库具有类似Seq的属性,但仍提供不错的性能,例如:https://github.com/nessos/Streams

教会编码的列表或换能器在避免中间数组值的同时也表现出色。