我编写了一些 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
我可以使用Zipped函数进行像 sum 这样的元素操作。让我有两个列表L1和L2,如下所示
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)
的尺寸L1,L2和L3是相同的。此外,我必须在集群上执行我的实际代码。
在 Scala 中对 List 进行元素求和的最快方法是什么?
我想从数组中选择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) 我有一个数据集,其中包含主文件夹内的多个文件夹,每个文件夹都包含多个 CSV 文件。每个 CSV 文件都有名为 X、Y 和 Z 的三列。我想创建一个数据框,以便数据框的前三列是三个 X、Y、Z。我想要另外两列,以便第四列包含从中读取 CSV 文件的文件夹的名称。第五列包含 CSV 文件的名称。如何在 Scala 和 Spark 中创建此数据框?
我有一个大数组,我想将数组的每个元素与给定的数字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)