加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 添加不可变的向量

发布时间:2020-12-16 10:08:02 所属栏目:安全 来源:网络整理
导读:我正在尝试使用 scalas immutable collection更多地工作,因为这很容易并行化,但我遇到了一些新手问题.我正在寻找一种从操作中创建(有效)新Vector的方法.确切地说,我想要类似的东西 val v : Vector[Double] = RandomVector(10000)val w : Vector[Double] = Ra
我正在尝试使用 scalas immutable collection更多地工作,因为这很容易并行化,但我遇到了一些新手问题.我正在寻找一种从操作中创建(有效)新Vector的方法.确切地说,我想要类似的东西

val v : Vector[Double] = RandomVector(10000)
val w : Vector[Double] = RandomVector(10000)
val r = v + w

我测试了以下内容:

// 1)
val r : Vector[Double] = (v.zip(w)).map{ t:(Double,Double) => t._1 + t._2 }

// 2)
val vb = new VectorBuilder[Double]()    
var i=0
while(i<v.length){
  vb += v(i) + w(i)
  i = i + 1
}
val r = vb.result

}

与使用Array的工作相比,两者都需要很长时间:

[Vector Zip/Map   ] Elapsed time 0.409 msecs
[Vector While Loop] Elapsed time 0.374 msecs
[Array While Loop ] Elapsed time 0.056 msecs
// with warm-up (10000) and avg. over 10000 runs

有没有更好的方法呢?我认为使用zip / map / reduce的工作具有以下优点:只要集合支持此功能,它就可以并行运行.

谢谢

解决方法

Vector不是专门用于Double的,所以你要为使用它而付出相当大的性能损失.如果你正在做一个简单的操作,你可能最好在单个核心上使用一个阵列而不是整个机器上的Vector或其他通用集合(除非你有12个核心).如果您仍然需要并行化,则可以使用其他机制,例如使用scala.actors.Futures.future创建实例,每个实例都在该范围的一部分上执行工作:

val a = Array(1,2,3,4,5,6,7,8)
(0 to 4).map(_ * (a.length/4)).sliding(2).map(i => scala.actors.Futures.future {
  var s = 0
  var j = i(0)
  while (j < i(1)) {
    s += a(j)
    j += 1
  }
  s
}).map(_()).sum  // _() applies the future--blocks until it's done

当然,您需要在更长的阵列(以及具有四个核心的计算机上)上使用它来进行并行化以改进.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读