Scala中List的ListBuffer实现高效的遍历计算

转载 2015年11月18日 15:54:42

分类: scala 2015-08-16 10:49 309人阅读 评论(0) 收藏 举报
scalasparkListBuffer

目录(?)[+]

我们通过对比下列4组程序,对比,发现优缺点
第一组: 递归

代码

 def main(args: Array[String]) {

    val data = 1 to 20000

    val currntTime =System.currentTimeMillis()
    increase(data.toList)
    println("used time=" + (System.currentTimeMillis() - currntTime))

  }

  def increase(list:List[Int]):List[Int] = list match {
       case List() => List()
       case head2 :: tail => (head2 + 1) :: increase(tail)
  }

 
运行结果:

    Exception in thread “main” java.lang.StackOverflowError
    at scala.collection.LinearSeqOptimizedclass.lengthCompare(LinearSeqOptimized.scala:261)atscala.collection.immutable.List.lengthCompare(List.scala:84)atcom.ifly.edu.scala.list.ListBufferInternals.increase(ListBuffer_Internals.scala:19)
    at com.ifly.edu.scala.list.ListBuffer_Internals.increase(ListBufferInternals.scala:20)atcom.ifly.edu.scala.list.ListBufferInternals.increase(ListBuffer_Internals.scala:20)
    at com.ifly.edu.scala.list.ListBuffer_Internals.increase(ListBufferInternals.scala:20)atcom.ifly.edu.scala.list.ListBufferInternals.increase(ListBuffer_Internals.scala:20)
    at

优点: 简单
缺点: 当数据过大时,不停创建堆栈,内存消耗大

第二组: 循环
代码:

  def main(args: Array[String]) {
    val data = 1 to 20000
    val currntTime =System.currentTimeMillis()
    increase_for(data.toList)
    println("used time=" + (System.currentTimeMillis() - currntTime))

  }
  //循环
  def increase_for(list:List[Int]) :List[Int] = {
    var result = List[Int]()
    for(element <- list){
      result = result::: List(element)
    }
    result
  }


运行结果
数据大小为20000

    used time=2611
    Process finished with exit code 0

数据大小为2000000

    used time= NIL (运行很长时间,没有结果),难以忍受
    Process finished with exit code 0

优点: 规避递归,数据多少不受什么影响
缺点: 产生很多临时List结果,当数据过大时,效率降低严重

第三组: For 循环 结合map处理
代码

  //list 的map function
  def increase_for2(list:List[Int]) :List[Int] ={
    println("list map ")
    list map(el => el +1)
  }

    1
    2
    3
    4
    5

运行结果
数据大小:2000000

    list map
    used time=2268
    Process finished with exit code 0

数据大小:2000000

    used time=2268
    Process finished with exit code 0数据大小:2000000

数据大小:2000000

    used time=48356

Process finished with exit code 0

优点: 不产生中间结果,比使用List的::: 方法快
缺点:
第四组: 使用ListBuffer

代码:


  def main(args: Array[String]) {
    val data = 1 to 2000000
    val currntTime =System.currentTimeMillis()
    increase_ListBuffer(data.toList)
    println("used time=" + (System.currentTimeMillis() - currntTime))

  }

  //listBuffer
  def increase_ListBuffer(list:List[Int]) :List[Int]={
    import scala.collection.mutable.ListBuffer
    var result = ListBuffer[Int]()
    for(element <- list){
      result += element+1
    }
    result.toList
  }

 

运行结果
数据大小为2000000

    used time=2284
    Process finished with exit code 0

数据大小为20000000

    Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded
    at scala.collection.mutable.ListBuffer.pluseq(ListBuffer.scala:168)
    at scala.collection.mutable.ListBuffer.pluseq(ListBuffer.scala:45)
    at scala.collection.generic.Growable
    anonfun
    pluspluseq1.apply(Growable.scala:48)atscala.collection.generic.Growableanonfunpluspluseq1.apply(Growable.scala:48)
    at scala.collection.immutable.Range.foreach(Range.scala:141)
    at scala.collection.generic.Growableclass.pluspluseq(Growable.scala:48)
    at scala.collection.mutable.ListBuffer.pluspluseq(ListBuffer.scala:176)atscala.collection.mutable.ListBuffer.pluspluseq(ListBuffer.scala:45)
    at scala.collection.TraversableLikeclass.to(TraversableLike.scala:629)atscala.collection.AbstractTraversable.to(Traversable.scala:105)atscala.collection.TraversableOnceclass.toList(TraversableOnce.scala:257)
    at scala.collection.AbstractTraversable.toList(Traversable.scala:105)
    at com.ifly.edu.scala.list.ListBuffer_Internals$.main(ListBuffer_Internals.scala:11)
    at com.ifly.edu.scala.list.ListBuffer_Internals.main(ListBuffer_Internals.scala)

优点: 数据在一定量的情况,效率非常高
缺点:
小结

ListBuffer 既可以规避递归,也可以 规避 创建中间结果,效率可靠

Scala ListBuffer使用备忘

Scala ListBuffer 使用备忘

使用Spark DataFrame进行大数据处理

简介     DataFrame让Spark具备了处理大规模结构化数据的能力,在比原有的RDD转化方式易用的前提下,计算性能更还快了两倍。这一个小小的API,隐含着Spark希望大一统「大数据江...
  • vfgbv
  • vfgbv
  • 2016年06月03日 13:55
  • 2982

第82讲:Scala中List的ListBuffer实现高效的遍历计算

我们通过对比下列3组程序,对比,发现优缺点第一组: 递归代码 def main(args: Array[String]) { val data = 1 to 20000 val currn...

Scala中ListBuffer高效遍历

package com.dt.scala.list object ListBuffer_Internals { def main(args: Array[String]): Unit = { ...

Scala中使用ListBuffer高效遍历List

在Scala中,使用ListBuffer高效遍历List。
  • yyywyr
  • yyywyr
  • 2016年01月10日 11:00
  • 2245

scala map/list/array/的常用内置遍历操作总结

scala map/list/array/的常用内置遍历操作总结。Scala 是面向函数的,所以在集合函数里,它很轻易地提供了非常丰富遍历操作,数组变换操作。这对于我们数据挖掘,爬虫,文本处理等都非常...

scala List集合的用法

一、前言: 人们常说,Scala是一个难掌握的语言,一是其面向函数和面向对象结合的原因,二是其丰富的语法和内置函数。 对于Conllection 这一章的内容,更多的是利用内置函数灵活地运用,避免...

第82讲:Scala中List的ListBuffer是如何实现高效的遍历计算的?学习笔记

第82讲:Scala中List的ListBuffer是如何实现高效的遍历计算的?学习笔记 本讲讲解对list集合类型的数据结构元素进行遍历访问时的效率问题, 对比几种算法,引出ListBuffer...
  • slq1023
  • slq1023
  • 2015年08月10日 22:53
  • 382

Scala深入浅出实战经典:34,对List进行高效的排序和倒排序代码实战

Scala深入浅出实战经典:34,对List进行高效的排序和倒排序代码实战
  • sd637
  • sd637
  • 2015年09月19日 13:39
  • 243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Scala中List的ListBuffer实现高效的遍历计算
举报原因:
原因补充:

(最多只允许输入30个字)