F# 序列、列表和数组
F# Sequences, Lists and Arrays
假设我有一个 '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
?
答案取决于您的 use-case,即 myList
有多大?但是,通常 F# 中的 Seq
速度慢且浪费内存。幸运的是,大多数时候这并不重要,因为我们通常只需要避免 "truly awful performance" 而 "mediocre performance" 通常就足够了。
我还没有测量它(羞耻)但是根据我的经验,在大多数情况下这会比 OP
的例子表现得更好
mylist |> Array.ofList |> Array.map f
尽快从列表转换为数组,然后映射数组(数组用于顺序访问,是 .NET 中更高效的结构之一)。
在一些罕见的情况下,存储中间数组值会导致内存交换到磁盘,我想使用 Seq
可能会有所帮助,但是在这些情况下,为什么我们要使用 List<_>
与 Array<_>
相比是否浪费内存(除非我们可以利用尾重用)?
.NET 中的一些库具有 Seq
类似的属性,但仍提供不错的性能,例如:https://github.com/nessos/Streams
Church-encoded 列表或转换器在避免中间数组值的同时也非常高效。
假设我有一个 'a
类型的元素列表,即;
let mylist: 'a list = ...
和类型为 'a -> 'b
;
let f: 'a -> 'b = ...
现在我想用f
将mylist
转换成'b array
。
如下:
mylist |> List.map f |> Array.ofList
通过以下方式在性能和内存方面进行了改进:
mylist |> List.toSeq |> Seq.map f |> Array.ofSeq
?
答案取决于您的 use-case,即 myList
有多大?但是,通常 F# 中的 Seq
速度慢且浪费内存。幸运的是,大多数时候这并不重要,因为我们通常只需要避免 "truly awful performance" 而 "mediocre performance" 通常就足够了。
我还没有测量它(羞耻)但是根据我的经验,在大多数情况下这会比 OP
的例子表现得更好mylist |> Array.ofList |> Array.map f
尽快从列表转换为数组,然后映射数组(数组用于顺序访问,是 .NET 中更高效的结构之一)。
在一些罕见的情况下,存储中间数组值会导致内存交换到磁盘,我想使用 Seq
可能会有所帮助,但是在这些情况下,为什么我们要使用 List<_>
与 Array<_>
相比是否浪费内存(除非我们可以利用尾重用)?
.NET 中的一些库具有 Seq
类似的属性,但仍提供不错的性能,例如:https://github.com/nessos/Streams
Church-encoded 列表或转换器在避免中间数组值的同时也非常高效。