通常(到目前为止)我尝试在Scala中使用不可变集合,尤其是如果我将一个集合的引用提供给我的程序的其他部分,我不能意外地覆盖原始源。使用微风,我想知道:为什么决定让DenseVector成为一个可变的集合?
这只是在背景中使用数组的一个(可能不需要的)副作用吗?如果是这样,为什么使用Arrays而不是另一个(不可变的)集合?
答案 0 :(得分:3)
性能。
由数组以外的任何东西支持的DenseVector
都会慢得多。它可以包装一个包含ImmutableArray
的{{1}},但这会强制执行某些操作,这些操作可以通过就地复制来避免复制,也可以与专业化进行奇怪的交互等等。
我不知道这有多重要(我怀疑不多),但是对于那些从数字计算(而不是Scala)来到Breeze的人来说,可预见性是可变的。例如。它使得在Matlab或R中实现的算法移植到Breeze变得更加简单。
答案 1 :(得分:1)
性能。虽然函数式编程提供了出色的抽象和严格的代码,但它通常不能提供最快的执行速度。 Java数组提供的开销远远低于Scala集合,因此高度重复的数字操作也是如此。 Breeze DenseVector
的方式相同,并且由引擎盖下的java数组支持。