小编Asi*_*sif的帖子

为什么在 Scala 中压缩比 zip 快?

我编写了一些 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)
Run Code Online (Sandbox Code Playgroud)

为了在速度方面比较这两种方法,我编写了以下代码:

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") …
Run Code Online (Sandbox Code Playgroud)

performance scala scala-collections jmh elementwise-operations

39
推荐指数
4
解决办法
4876
查看次数

对两个列表进行元素求和的最快方法

我可以使用Zipped函数进行像 sum 这样的元素操作。让我有两个列表L1L2,如下所示

val L1 = List(1,2,3,4)
val L2 = List(5,6,7,8)
Run Code Online (Sandbox Code Playgroud)

我可以按以下方式计算元素总和

(L1,L2).zipped.map(_+_)
Run Code Online (Sandbox Code Playgroud)

结果是

List(6, 8, 10, 12) 
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。

我在我的实际代码中使用Zipped函数,但它需要太多时间。实际上,我的列表大小超过1000,我有超过1000 个列表,我的算法是迭代的,迭代次数可能高达10 亿

在代码中,我必须做以下事情

list =( (L1,L2).zipped.map(_+_).map (_  * math.random) , L3).zipped.map(_+_)
Run Code Online (Sandbox Code Playgroud)

的尺寸L1L2L3是相同的。此外,我必须在集群上执行我的实际代码。

在 Scala 中对 List 进行元素求和的最快方法是什么?

performance scala list apache-spark elementwise-operations

7
推荐指数
1
解决办法
298
查看次数

从 Array 中随机选择 n 个元素

我想从数组中选择n 个唯一元素,其中数组的大小通常为1000并且n 的值为3。我想在迭代算法中实现这个,其中迭代大约为3000000,我必须在每次迭代中获得 n 个唯一元素。这里有一些我喜欢的可用解决方案,但由于它们的缺点,我无法使用它们,如下所述。

import scala.util.Random
val l = Seq("a", "b", "c", "d", "e")
val ran = l.map(x => (Random.nextFloat(), x)).sortBy(_._1).map(_._2).take(3)
Run Code Online (Sandbox Code Playgroud)

此方法较慢,因为必须创建三个数组并对数组进行排序。

 val list = List(1,2,3,4,5,1,2,3,4,5)
 val uniq = list.distinct
 val shuffled = scala.util.Random.shuffle(uniq)
 val sampled = shuffled.take(n)
Run Code Online (Sandbox Code Playgroud)

生成两个数组并且对大数组进行混洗是较慢的过程。

 val arr = Array.fill(1000)(math.random )
 for (i <- 1 to n; r = (Math.random * xs.size).toInt) yield arr(r)
Run Code Online (Sandbox Code Playgroud)

这是一种更快的技术,但有时会多次返回相同的元素。这是一个输出。

val xs = List(60, 95, 24, 85, 50, 62, …
Run Code Online (Sandbox Code Playgroud)

random scala

5
推荐指数
1
解决办法
417
查看次数

从spark中的多个文件夹加载多个文件

我有一个数据集,其中包含主文件夹内的多个文件夹,每个文件夹都包含多个 CSV 文件。每个 CSV 文件都有名为 X、Y 和 Z 的三列。我想创建一个数据框,以便数据框的前三列是三个 X、Y、Z。我想要另外两列,以便第四列包含从中读取 CSV 文件的文件夹的名称。第五列包含 CSV 文件的名称。如何在 Scala 和 Spark 中创建此数据框?

scala apache-spark

2
推荐指数
1
解决办法
1911
查看次数

在Scala中将数组的每个元素与一个数字相乘的最快方法

我有一个大数组,我想将数组的每个元素与给定的数字N相乘。我可以通过以下方式做到这一点

val arr  =  Array.fill(100000)(math.random)
val N    =  5.0 
val newArr  =  arr.map (  _ * N )
Run Code Online (Sandbox Code Playgroud)

所以这将返回我想要的新数组。另一种方式可能是

def demo (arr :Array [Double]  , value : Double  ) : Array[Double] ={
var res : Array[Double] = Array()
if (  arr.length == 1  )
  res =  Array (  arr.head  + value  )
else
  res = demo  (  arr.slice(0, arr.length/2) , value   )   ++   demo  (   arr.slice  (  arr.length / 2  ,  arr.length  )  ,  value  )
res
} …
Run Code Online (Sandbox Code Playgroud)

arrays scala

1
推荐指数
1
解决办法
863
查看次数