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 当然,您需要在更长的阵列(以及具有四个核心的计算机上)上使用它来进行并行化以改进. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |