【发布时间】:2017-03-21 08:01:42
【问题描述】:
通常(到目前为止一直)我尝试在 Scala 中使用不可变集合,特别是如果我将一个集合的引用引用到程序的其他部分,我就不会意外覆盖原始源。使用微风,我想知道:为什么决定让 DenseVector 成为可变集合?
这只是在后台使用数组的一个(可能不需要的)副作用吗?如果是这样,为什么使用数组,而不是另一个(不可变的)集合?
【问题讨论】:
标签: scala scala-breeze
通常(到目前为止一直)我尝试在 Scala 中使用不可变集合,特别是如果我将一个集合的引用引用到程序的其他部分,我就不会意外覆盖原始源。使用微风,我想知道:为什么决定让 DenseVector 成为可变集合?
这只是在后台使用数组的一个(可能不需要的)副作用吗?如果是这样,为什么使用数组,而不是另一个(不可变的)集合?
【问题讨论】:
标签: scala scala-breeze
性能。
由数组以外的任何东西支持的DenseVector 会明显变慢。它可以包装一个 ImmutableArray 包装一个 Array,但这会强制执行一些操作,这些操作可以通过就地复制来避免复制,可能与专业化进行奇怪的交互等。
我不知道这有多重要(我怀疑不是很重要),但是对于从数值计算(而不是从 Scala)来到 Breeze 的人来说,可变性是可以预料的。例如。它使得将在 Matlab 或 R 中实现的算法移植到 Breeze 变得更加简单。
【讨论】:
a=c(1,2); b=a; a[1]=0,a 将是 0 2 3,而 b 将是 1 2 3。 Scala 中的等价物是不可变的var。
a = a(1) := 0
性能。虽然函数式编程提供了出色的抽象和紧凑的代码,但它通常不能提供最快的执行。 Java 数组提供的开销远低于 Scala 集合,因此是高度重复的数字操作的首选。 Breeze DenseVectors 也是同样的方式,并由底层的 java 数组支持。
【讨论】: