繁体   English   中英

在F#中的cons运算符(::)性能

[英]cons operator (::) performance in F#

在官方文档中,声明::@快。

一旦所有列表在F#中都是不可变的,为什么会有区别? 无论如何,应该复制原始列表。 但是如果是::我们将在前面加上,而在@情况下我们会追加。 它应该是相同的复杂性。

有什么不同?

你的假设不正确。

当您使用::前缀时,原始列表实际上并未复制。 原始列表保留在内存中,确切位置,新列表现在由新元素和指向原始列表的指针组成,这是它的尾部。

考虑一下:

let x = [1;2;3]
let y = 4 :: x

该程序将产生以下内存布局:

 y -> 4
       \
        v
        1 -> 2 -> 3 -> (END)
        ^
       /
      x

这是唯一可能的, 因为列表是不可变的:因为我们知道原始列表永远不会改变,所以我们只能将它作为新列表的尾部。

这种安排通常称为“ 持久数据结构 ”。 单链表只是这类结构中最简单的一种。


另一方面,当与@附加时,您确实必须复制整个原始列表。 您不能重复使用它的任何部分。

这就是前期加快的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM