Scala 为什么DenseVector是可变集合?

Scala 为什么DenseVector是可变集合?,scala,scala-breeze,Scala,Scala Breeze,通常(到目前为止总是)我尝试在Scala中使用不可变集合,特别是如果我将集合引用给程序的其他部分,我就不能意外地重写原始源代码。使用breeze,我想知道:为什么决定让DenseVector成为可变集合 这仅仅是在后台数组中使用的副作用(可能是不必要的)?如果是这样,为什么使用数组而不是另一个(不可变)集合?性能。虽然函数式编程提供了出色的抽象和紧凑的代码,但它通常不能提供最快的执行速度。Java数组提供的开销比Scala集合少得多,因此对于高度重复的数值操作也是如此。BreezeDenseVe

通常(到目前为止总是)我尝试在Scala中使用不可变集合,特别是如果我将集合引用给程序的其他部分,我就不能意外地重写原始源代码。使用breeze,我想知道:为什么决定让DenseVector成为可变集合


这仅仅是在后台数组中使用的副作用(可能是不必要的)?如果是这样,为什么使用数组而不是另一个(不可变)集合?

性能。虽然函数式编程提供了出色的抽象和紧凑的代码,但它通常不能提供最快的执行速度。Java数组提供的开销比Scala集合少得多,因此对于高度重复的数值操作也是如此。Breeze
DenseVector
s也采用相同的方式,并由引擎盖下的java阵列支持。

性能。虽然函数式编程提供了出色的抽象和紧凑的代码,但它通常不能提供最快的执行速度。Java数组提供的开销比Scala集合少得多,因此对于高度重复的数值操作也是如此。Breeze
DenseVector
s也采用同样的方式,并在引擎盖下由java阵列支持

  • 表演

    由数组以外的任何对象支持的
    DenseVector
    将大大降低速度。它可以包装一个
    不可变数组
    ,该数组包装一个
    数组
    ,但这将强制执行一些操作,这些操作可以通过就地复制来避免复制,可能会与专门化进行奇怪的交互,等等

  • 我不知道这有多重要(我怀疑不太重要),但对于从数值计算(而不是Scala)来到Breeze的人来说,易变性是意料之中的。例如,将在Matlab或R中实现的算法移植到Breeze会更简单

  • 表演

    由数组以外的任何对象支持的
    DenseVector
    将大大降低速度。它可以包装一个
    不可变数组
    ,该数组包装一个
    数组
    ,但这将强制执行一些操作,这些操作可以通过就地复制来避免复制,可能会与专门化进行奇怪的交互,等等

  • 我不知道这有多重要(我怀疑不太重要),但对于从数值计算(而不是Scala)来到Breeze的人来说,易变性是意料之中的。例如,将在Matlab或R中实现的算法移植到Breeze会更简单


  • 2.我似乎只对了一半:Execute
    a=c(1,2);b=a;a[1]=0
    在R中,
    a
    将是
    023
    ,而b将是
    1233
    。Scala中的等价物将是一个不可变的
    var
    。尽管如此,如果DenseVector是不可变的,我将不得不编写
    a=a(1):=0
    是的,Breeze在这方面的行为类似于Numpy,而不是R或Matlab(IIRC),这可能会让R/Matlab用户感到困惑。再次,我怀疑这是一个薄弱的原因(如果有的话)。我似乎只对了一半:Execute
    a=c(1,2);b=a;a[1]=0
    在R中,
    a
    将是
    023
    ,而b将是
    1233
    。Scala中的等价物将是一个不可变的
    var
    。尽管如此,如果DenseVector是不可变的,我将不得不编写
    a=a(1):=0
    是的,Breeze在这方面的行为类似于Numpy,而不是R或Matlab(IIRC),这可能会让R/Matlab用户感到困惑。我再次怀疑这是一个薄弱的原因(如果有的话)。