[英]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.