我编写了一些 Scala 代码来对集合执行元素操作。在这里,我定义了两个执行相同任务的方法。一种方法使用 zip
其他用途zipped
.
def ES (arr :Array[Double], arr1 :Array[Double]) :Array[Double] = arr.zip(arr1).map(x => x._1 + x._2)
def ES1(arr :Array[Double], arr1 :Array[Double]) :Array[Double] = (arr,arr1).zipped.map((x,y) => x + y)
def fun (arr : Array[Double] , arr1 : Array[Double] , f :(Array[Double],Array[Double]) => Array[Double] , itr : Int) ={
val t0 = System.nanoTime()
for (i <- 1 to itr) {
f(arr,arr1)
}
val t1 = System.nanoTime()
println("Total Time Consumed:" + ((t1 - t0).toDouble / 1000000000).toDouble + "Seconds")
}
fun
方法和通行证ES
和 ES1
如下:fun(Array.fill(10000)(math.random), Array.fill(10000)(math.random), ES , 100000)
fun(Array.fill(10000)(math.random), Array.fill(10000)(math.random), ES1, 100000)
ES1
使用 zipped
比方法更快 ES
使用 zip
.zipped
比 zip
快?最佳答案
回答你的第二个问题:
Is there any more faster way to do element wise operation on a collection in Scala?
zipped
可以通过预先分配正确大小的固定可变数组来强制执行求和(因为当其中一个集合用完元素时 zip 停止),然后将适当索引处的元素添加在一起(因为按序数索引访问数组元素是一个非常快的操作)。ES3
到您的测试套件:def ES3(arr :Array[Double], arr1 :Array[Double]) :Array[Double] = {
val minSize = math.min(arr.length, arr1.length)
val array = Array.ofDim[Double](minSize)
for (i <- 0 to minSize - 1) {
array(i) = arr(i) + arr1(i)
}
array
}
在我的 i7 上,我得到以下响应时间:OP ES Total Time Consumed:23.3747857Seconds
OP ES1 Total Time Consumed:11.7506995Seconds
--
ES3 Total Time Consumed:1.0255231Seconds
更令人发指的是对两个数组中较短的数组进行直接就地变异,这显然会破坏这个较短数组的内容,因此只有在不需要原始数组进行进一步工作时才应该实现调用者:def ES4(arr :Array[Double], arr1 :Array[Double]) :Array[Double] = {
val minSize = math.min(arr.length, arr1.length)
val array = if (arr.length < arr1.length) arr else arr1
for (i <- 0 to minSize - 1) {
array(i) = arr(i) + arr1(i)
}
array
}
Total Time Consumed:0.3542098Seconds
但显然,直接改变作为参数传递的数组元素并不符合 Scala 的精神——这段代码有副作用。https://stackoverflow.com/questions/59598239/
相关文章:
.net - ObservableCollection-无法实现,因为它没有匹配的返回类型
flash - 无法解析
xcode - 项目清理后,Cocos2d/box2d项目将无法编译
android - 使用PendingIntent的编译错误
ruby-on-rails - 使用Mysql在共享服务器中部署Rails应用程序时出错
python - 错误 : invalid mode ('r' ) - Cannot conduct
compilation - 在我的编译器中完全可以正常工作,但在将其提交到在线社区时会出现编译错误