假设我有一个'a
类型的元素列表,即;
let mylist: 'a list = ...
和类型'a -> 'b
的函数f;
let f: 'a -> 'b = ...
现在,我想使用f
将mylist
转换为'b array
。
以下内容:
mylist |> List.map f |> Array.ofList
从性能和内存方面进行了以下改进:
mylist |> List.toSeq |> Seq.map f |> Array.ofSeq
?
答案 0 :(得分:0)
答案取决于您的用例,即myList
有多大?但是,通常,F#中的Seq
速度很慢,并且浪费内存。幸运的是,对于大多数时间而言,这并不重要,因为我们通常只需要避免“真正糟糕的表现”,而“中等表现”通常就足够了。
我没有衡量(羞耻),但是根据我的经验,在大多数情况下,这要比OP的示例要好
mylist |> Array.ofList |> Array.map f
尽快从列表转换为数组,然后映射数组(数组用于.NET中效率更高的结构之一)。
在一些罕见的情况下,存储中间数组值会导致内存被交换到磁盘,我想使用Seq
可能会有所帮助,但是在这些情况下,为什么我们要使用List<_>
,因为这很浪费与Array<_>
相比具有更大的内存(除非我们可以使用尾部重用)?
.NET中的某些库具有类似Seq
的属性,但仍提供不错的性能,例如:https://github.com/nessos/Streams
教会编码的列表或换能器在避免中间数组值的同时也表现出色。