Scala 集合已排序、sortWith 和 sortBy 性能

2024-03-17

Scala在标准库中包含了几种用于对列表进行排序的方法,例如对列表进行排序list,可以使用:

list.sorted
list.sortWith(_<_)
list.sortBy(x=>x)

虽然这些可能是对列表进行排序的最简单方法,但我发现对于较大的列表,它们具有显着的性能缺点。

例如,要对一百万个整数进行排序,sorted 平均需要 500ms,而 sortWith 和 sortBy 大约需要 700ms。与此相比,scala.util.Sorting.quickSort 大约需要 120 毫秒,而 java.util.Arrays.sort 大约需要 100 毫秒。对于较大的列表,当我们进一步扩展时,会观察到这种多因素差异。该模式如下图所示。

造成这种性能滞后的原因是什么?为什么标准方法不使用更高效的算法/实现?


请注意,这些线如何具有相同的斜率,但彼此偏移?通过对数标度,我们看到的是常数因子差异。sorted和朋友支付转换费用List to an Array,排序(与java.util.Arrays.sort,事实上),并转换回List. scala.util.Sorting.quickSort and java.util.Arrays.sort直接对数组进行操作。这log n快速排序的因素n log n性能在很大程度上无关紧要,因此,由于创建数组和结果列表所需的线性时间,我们最终会得到常数因子差异。五倍差的​​性能可能看起来很糟糕,但请记住List每个元素都有一个 cons 单元,这使得在创建时可以进行大量的随机访问Array,然后创建新的List需要花费时间分配内存,并且很可能需要一个或两个垃圾收集周期。

对于基元列表,情况更糟。List是通用的,因此任何原语都必须装箱,这增加了另一层间接性。不幸的是Array创建的值也包含装箱值。实际上,你最终会排序一个Array[java.lang.Integer]当你真的想要排序时Array[Int].

总结一下:排序算法是相同的,但可变数组优于不可变单链表是有充分理由的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 集合已排序、sortWith 和 sortBy 性能 的相关文章

  • 模拟 BlazeClientBuilder[IO] 以返回模拟客户端[IO]

    我正在使用BlazeClientBuilder IO resource方法得到Client IO 现在 我想模拟客户端进行单元测试 但不知道该怎么做 有没有一个好的方法来嘲笑这个 我会怎么做 class ExternalCall val r
  • 子查询与连接

    我重构了从另一家公司继承的应用程序的一个缓慢部分 以使用内部联接而不是子查询 例如 WHERE id IN SELECT id FROM 重构后的查询运行速度提高了约 100 倍 50 秒到 0 3 我预计会有改进 但谁能解释为什么它如此剧
  • 在流星收集加载时显示加载程序

    我有一个模板 task list 看起来像这样 each tasks gt task each Template task list tasks返回一个集合 在用户界面中 加载似乎需要一些时间 当集合正在加载时 我想显示一个加载指示器 关于
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 使用 net.liftweb.json 或 scala.util.parsing.json 解析大型 (30MB) JSON 文件会出现 OutOfMemoryException。有什么建议吗?

    我有一个包含大量测试数据的 JSON 文件 我想解析这些数据并推送我正在测试的算法 它的大小约为 30MB 包含大约 60 000 个元素的列表 我最初在 scala util parsing json 中尝试了简单的解析器 如下所示 im
  • 存储 PHP 数组的首选方法(json_encode 与序列化)

    我需要将多维关联数据数组存储在平面文件中以进行缓存 我偶尔可能会遇到需要将其转换为 JSON 以便在我的 Web 应用程序中使用的情况 但绝大多数时候我会直接在 PHP 中使用该数组 在此文本文件中将数组存储为 JSON 或 PHP 序列化
  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 如何在映射中将字符串转换为 Seq[String]

    我有一个Map String String 以及需要的第三方功能Map String Seq String 有没有一种简单的方法来转换它 以便我可以将地图传递给函数 original mapValues Seq 注意mapValues返回地
  • 按偶数和奇数排序

    我想知道是否可以使用 std sort 函数按偶数或奇数对数字进行排序 我有以下代码 但我不确定如何在 std sort 中实现 inline bool isEven const Point n return n getX 2 0 它是否正
  • 在 Scala 中将元素追加到列表末尾

    我无法添加 type 元素T到一个列表中List T 我尝试过myList myElement但它似乎创建了一个奇怪的对象并访问myList last始终返回放入列表中的第一个元素 我怎么解决这个问题 List 1 2 3 4 Result
  • 解决“Show”类型类实例的隐式问题

    我正在努力使Gender实施Show类型类 scala gt trait Gender extends Show Gender defined trait Gender scala gt case object Male extends G
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 属性错误:“列表”对象没有属性“拆分”

    我正在尝试读取一个文件并用逗号分隔每行中的一个单元格 然后仅显示第一个和第二个单元格 其中包含有关纬度和经度的信息 这是文件 time 纬度 经度 类型2015 03 20T10 20 35 890Z 38 8221664 122 7649
  • 为什么对于小数组,for-of 循​​环比标准 for 循环快,而对于大数组则慢?

    在 JavaScript 中 我注意到 ES6for of循环的性能与传统的有很大不同for start stop step loop 基准 const n 10000 const arr Array n fill map e i gt i
  • scala 提供类似 C++ 模板的东西吗?

    我来自 C 并试图了解 scala 的类型系统 考虑以下 C 模板类 template
  • 应对失败的“未来”

    给出以下两种方法 def f Future Int Future 10 def g Future Int Future 5 我想把它们写成 scala gt import scala concurrent Future import sca
  • 为什么自类型类可以声明类

    我知道 Scala 只能混合特征 这对于依赖注入和蛋糕模式是有意义的 我的问题是为什么我仍然可以声明一个需要另一个 类 但不需要特征的类 Code class C class D self C gt 这仍然编译成功 我认为它应该编译失败 因
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack

随机推荐

  • 在 Windows 上同时安装 Python 2.x 和 3.x 时使用较旧的 Python 2.x

    我是蟒蛇新手 我已在 64 位 Windows 计算机上安装了适用于 x64 的 Python 3 2 2 和适用于 x86 的 Python 2 7 我有一些为 python 2 x 版本编码的 python 代码 但每次我尝试通过双击运
  • 尝试加载 Crystal Reports 运行时时发生错误

    我已经在内部网站上工作了一段时间 为客户维护它 除了一些错误外 该网站正在按预期运行 但突然间 出现了相关错误 这以前从未发生过 以下是我们使用的软件 Windows Server 2008 R2 64 位 Visual Studio 20
  • 有没有办法提前测试Windows exe是否会因为缺少dll而无法加载?

    如果您尝试在没有任何更新的情况下在 Windows 8 1 上安装 vs2015 Redistributable 它将安装失败 但它会在安装过程中进行足够多的操作 guid 位于注册表中 因此 如果您运行一个程序来检查注册表中是否存在可再发
  • 在 .NET 中组合多个 PNG8 图像的最简单方法

    我正在尝试在 C 中将一堆 8 位 PNG 图像组合成一个更大的 PNG 图像 奇怪的是 这似乎特别困难 由于图形不支持索引颜色 因此您不能使用它 因此我尝试构建非索引位图 使用图形 并将其转换为索引颜色位图 转换很好 但我不知道如何设置输
  • NTP请求包

    我试图弄清楚我需要在 NTP 请求包中发送 客户端 什么才能从服务器检索 NTP 包 我正在 Cortex M3 Stellaris LM3S6965 上使用 LWIP 据我了解 我将收到 UDP 标头 然后收到具有不同时间戳的 NTP 协
  • 使用 Android AccountManager 自定义帐户类型

    我有一个帐户类型 mypackage account 和一个内容权限 mypackage 我有一个Service提供了一个实现AbstractAccountAuthenticator the addAccount方法的实现如下 The us
  • iOS6中无法设置UITableViewCell的背景颜色?

    我开始在模拟器下测试我的应用程序 因为我没有任何 iOS 6 设备 并偶然发现了奇怪的问题 我无法设置 UITableViewCell 的 backgroundColor 属性 如果我这样 cell contentView backgrou
  • Windows 窗体线程和事件 - 列表框更新迅速,但进度条经历巨大延迟

    我们的团队正在创建一个新的招聘工作流程系统来取代旧的系统 我的任务是将旧数据迁移到新模式中 我决定通过创建一个小型 Windows 窗体项目来实现此目的 因为架构完全不同 并且直接的 TSQL 脚本并不是一个足够的解决方案 执行此工作的主要
  • Firebase 身份验证 - 电话 -“INVALID_CERT_HASH”

    当我尝试在本地 Android 设备中运行电话身份验证时 出现以下错误 GetAuthDomainTask Error getting project config Failed with E FirebaseAuth 25345 erro
  • 更改 NetBeans 项目中的 JRE

    我有一个使用 JRE 1 4 环境的 NetBeans 项目 这意味着我无法使用泛型 如何更改项目以使用 1 6 以便我可以使用泛型 In the Project选项卡 右键单击该项目并选择特性 在里面Library类别选择Java 平台
  • 在 C# 中更快地调用 PowerShell cmdlet

    我可以使用 C 中的 Powershell cmdlet 从 O365 获取用户详细信息 问题是获取时间 那太慢了 每个用户需要 2 秒 所以如果我有大量用户 就会导致时间问题 在这里我只想打印所有用户的信息 如名称 组详细信息 许可证 我
  • 在类内部使用具有非静态大小的数组

    我想使用一个可以在 4d 数组内为我存储值的类 Matrix 我想用SetSize为了设置的大小Matrix从我的main功能 class Value public int a int b int c int d sets the valu
  • Android 上的 Socket IO 连接失败

    我正在尝试使用 Socket IO Android 和 Node 创建一个简单的聊天 当我运行应用程序并尝试连接到服务器时 它总是因超时错误而失败 我不明白为什么 这是节点代码 app require express http requir
  • 使用 Watin 登录网页

    我尝试在网页上登录 网页上有两个带有输入的表单 输入具有相同的 Id 用户名 我怎样才能获得正确的输入来设置我的文本 这是我的错误代码 browser TextField Find ByName 用户名 TypeText test123 o
  • 如何从 8 位字节转换为 7 位字节(Base 256 到 Base 128)

    如何从 8 位字节转换为 7 位字节 Base 256 到 Base 128 我想做这样的事情 public string BytesToString byte in public byte StringToBytes string in
  • Angular Ag-Grid 无法正确显示

    我正在尝试使用角度Ag Grid https www ag grid com 在我的网络应用程序中 我已经遵循了这些教程 角网格 开始使用 ag Grid https www ag grid com angular getting star
  • Powershell 默认下拉值

    我有一个脚本 用户可以从下拉列表中选择选项 但如果用户没有选择任何内容 我就会收到错误 即使用户未输入值 如何设置返回的默认值 这是脚本 Edit This item to change the DropDown Values array
  • xquery 中的 SUM 和 GROUP BY 以及 1 个 xml 文件

    我有一个 SQL 查询 SELECT ShipVia SUM Freight FROM Orders GROUP BY ShipVia 它从访问数据库返回以下值 Ship Via TotalFreight 1 16 185 33 2 28
  • android - 如何创建可重用的函数?

    在我的 Android 项目中 我有很多活动 其中一些活动已经扩展了其他内容 例如地图活动或 BroadcastReceiver 如何创建一个可以从任何活动调用的函数 因为我不想在多个活动中重复任何代码 thanks 如果我有一些有用的函数
  • Scala 集合已排序、sortWith 和 sortBy 性能

    Scala在标准库中包含了几种用于对列表进行排序的方法 例如对列表进行排序list 可以使用 list sorted list sortWith lt list sortBy x gt x 虽然这些可能是对列表进行排序的最简单方法 但我发现