arrays - 将 Scala 数组转换为唯一排序列表的有效方法

标签 arrays list scala optimization sorting

任何人都可以在 Scala 中优化以下语句:

// maybe large
val someArray = Array(9, 1, 6, 2, 1, 9, 4, 5, 1, 6, 5, 0, 6) 

// output a sorted list which contains unique element from the array without 0
val newList=(someArray filter (_>0)).toList.distinct.sort((e1, e2) => (e1 > e2))

既然性能很关键,有没有更好的办法呢?

谢谢你。

最佳答案

这条简单的代码是迄今为止最快的代码之一:

someArray.toList.filter (_ > 0).sortWith (_ > _).distinct

但到目前为止,明显的赢家是 - 由于我的测量 - Jed Wesley-Smith。也许如果 Rex 的代码是固定的,它看起来会有所不同。

bench diagram

典型免责声明 1 + 2:
  • 我修改了代码以接受一个数组并返回一个列表。
  • 典型的基准考虑因素:
  • 这是随机数据,平均分布。对于 100 万个元素,我创建了一个 0 到 100 万之间的 100 万个整数数组。因此,或多或少的零,或多或少的重复,它可能会有所不同。
  • 这可能取决于机器等。我使用的是单核 CPU,Intel-Linux-32bit,jdk-1.6,scala 2.9.0.1

  • 这里是底层 benchcoat-code and the concrete code 生成图形(gnuplot)。 Y 轴:以秒为单位的时间。 X 轴:数组中的 100 000 到 1 000 000 个元素。

    更新:

    在发现 Rex 代码的问题后,他的代码与 Jed 的代码一样快,但最后一个操作是将他的 Array 转换为 List(以填充我的基准接口(interface))。使用 var result = List [Int] , 和 result = someArray (i) :: result加快了他的代码速度,因此它的速度大约是 Jed-Code 的两倍。

    另一个可能有趣的发现是:如果我按照过滤器/排序/不同 (fsd) => (dsf, dfs, fsd, ...) 的顺序重新排列我的代码,所有 6 种可能性都没有显着差异。

    关于arrays - 将 Scala 数组转换为唯一排序列表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8160037/

    相关文章:

    arrays - Array#push 导致大数组出现 "stack level too deep"错误

    python - 当我使用 operator[] 时列出导致错误的项目

    scala - 在 Jupyter 实验室中读取 bigquery 时,无法实例化提供程序 com.google.cloud.spark.bigquery.BigQueryRelationProvider

    scala - Actor : How to efficiently handle read-moSTLy data

    javascript - 操作 MongoDB 中引用数组中元素的顺序

    arrays - 如何选择五个随机的非重复按钮并将其复制到panel1?

    javascript - 从对象数组中获取最后一个匹配的键来检查值

    python - 使用 for 循环从列表中删除元素不起作用,但使用列表理解很好

    Python 将整数列表作为列添加到 CSV

    scala - 如何计算合并的最佳分区数?