对哈希进行排序的最快方法是什么?

2023-12-06

人们经常问什么是best方式对哈希进行排序,但随后他们不会询问所需的后续问题,即什么是fastest方式,这确实决定了最好的方式。

无论使用什么版本的 Ruby,在 Ruby 中对哈希进行排序的最快方法是什么?

我正在寻找其他答案,以涵盖极端情况,或通过更通用和/或更快速的方法发现问题。


对哈希进行排序的最快方法是什么?

require 'fruity'

HASH = Hash[('a'..'z').to_a.shuffle.map{ |k| [k, 1] }]

def sort_hash1(h)
  h.sort.to_h
end

def sort_hash2(h)
  Hash[h.sort]
end

def sort_hash3(h)
  Hash[h.sort_by{ |k, v| k }]
end

def sort_keys(h)
  keys = h.keys.sort
  Hash[keys.zip(h.values_at(*keys))]
end

puts "Running on Ruby v#{ RUBY_VERSION }"
puts

compare do
  do_sort_hash1 { sort_hash1(HASH) } if [].respond_to?(:to_h)
  do_sort_hash2 { sort_hash2(HASH) }
  do_sort_hash3 { sort_hash3(HASH) }
  do_sort_keys { sort_keys(HASH) }
end

在 Mac OS 笔记本电脑上运行上述代码会产生以下输出:

# >> Running on Ruby v2.2.2
# >> 
# >> Running each test 256 times. Test will take about 1 second.
# >> do_sort_keys is faster than do_sort_hash3 by 39.99999999999999% ± 10.0%
# >> do_sort_hash3 is faster than do_sort_hash1 by 1.9x ± 0.1
# >> do_sort_hash1 is similar to do_sort_hash2

And:

# >> Running on Ruby v1.9.3
# >> 
# >> Running each test 256 times. Test will take about 1 second.
# >> do_sort_keys is faster than do_sort_hash3 by 19.999999999999996% ± 10.0%
# >> do_sort_hash3 is faster than do_sort_hash2 by 4x ± 0.1

将哈希大小加倍:

HASH = Hash[[*('a'..'z'), *('A'..'Z')].shuffle.map{ |k| [k, 1] }]

结果是:

# >> Running on Ruby v2.2.2
# >> 
# >> Running each test 128 times. Test will take about 1 second.
# >> do_sort_keys is faster than do_sort_hash3 by 50.0% ± 10.0%
# >> do_sort_hash3 is faster than do_sort_hash1 by 2.2x ± 0.1
# >> do_sort_hash1 is similar to do_sort_hash2

And:

# >> Running on Ruby v1.9.3
# >> 
# >> Running each test 128 times. Test will take about 1 second.
# >> do_sort_keys is faster than do_sort_hash3 by 30.000000000000004% ± 10.0%
# >> do_sort_hash3 is faster than do_sort_hash2 by 4x ± 0.1

这些值将根据硬件而变化,但相对结果不应改变。

Fruity选择使用内置基准为了简单起见,类。

这是由“按键对哈希值进行排序,然后在 Ruby 中返回哈希值".

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

对哈希进行排序的最快方法是什么? 的相关文章

随机推荐

  • iPhone 6 不同的故事板?

    当我们拥有iPhone 4 and 5 我们检查了屏幕尺寸 并为每部 iPhone 制作了 2 个故事板 iPhone 4 if height 480 storyboard UIStoryboard storyboardWithName S
  • 显示屏幕顶部而不是位于 inputAccessoryView 上的标签

    这是我的代码 var messageView UITextView var textView UITextView textView text Add your message here textView textColor UIColor
  • 将表从 R 传输到 SQL

    我知道通常要从头开始创建一个SQL表 您需要首先创建一个空表 然后将数据插入到该表中 例如 create table CREATE TABLE Customers CustomerName int ContactName varchar 2
  • 在 jQuery Mobile 1.1 中进行繁重处理之前显示加载微调器?

    我要疯狂地尝试让旋转器出现 我已将繁重的处理功能绑定到一个按钮 document delegate clearread tap onClearRead 所以点击它会调用这个 var onClearRead function setTimeo
  • “System.IO.Stream”不包含 Windows 应用商店应用中“关闭”的定义

    当尝试在 Windows 应用商店应用程序上构建我的 Unity 3D 项目时 出现此错误 System IO Stream 不包含 Close 的定义 并且找不到接受 System IO Stream 类型的第一个参数的扩展方法 Clos
  • 用于突出显示功能的更高效的 JavaScript 代码?

    所以这是我需要清理的功能 我需要创建一个功能 观众可以单击句子中的任何单词 它就会突出显示 然而 我需要做到一次只突出显示一个单词 例如 如果您单击单词 you 然后您改变主意并单击单词 eagle 则单词 you 将被取消选择 它已经有现
  • UseStatusCodePagesWithReExecute 不适用于禁止 (403)

    当我指定 404 作为 http 结果代码时 UseStatusCodePagesWithReExecute正在按预期工作 当我指定 403 作为 http 结果代码时 UseStatusCodePagesWithReExecute没有按预
  • 运行 Java 程序

    我查看了其他一些 SO 问题 没有找到任何可以解决我的问题的内容 我有一个 Main java 文件 如下 和一个 OthelloLib jar 文件 没有关联的源文件 Running javac Main java失败了 Main jav
  • 如何在 ASP.Net Core 6.0 中实现 HSTS 标头?

    我需要在 ASP Net Core 6 0 WEB API 应用程序中实现 HSTS 标头安全性 下面是我的程序 cs var builder WebApplication CreateBuilder args Https redirect
  • Twilio 录制:暂停和恢复

    我相信答案是否定的 但 Twilio 是否提供暂停 恢复录音的功能 用例是对通话进行录音 但在收集敏感信息时暂停录音 从 REST 文档来看 它似乎不是受支持的功能 我认为有人可能已经找到了满足此要求的一些选项 这是可能的 尽管从文档中并不
  • 在 Python 3 中从 utf-16 转换为 utf-8

    我正在使用 Python 3 进行编程 但遇到了一个小问题 我在网上找不到任何关于它的参考 据我了解 默认字符串是 utf 16 但我必须使用 utf 8 我找不到将从默认字符串转换为 utf 8 的命令 我非常感谢你的帮助 在 Pytho
  • 当 springboot 应用程序在 docker 容器上运行时,无法找到 LoginModule 类:org.apache.kafka.common.security.plain.PlainLoginModule

    我有一个 Spring Boot 应用程序使用spring kafka向 kafka 发布消息的依赖 kafka 配置使用标准 kafka properties sasl jaas config 对 kafka 服务器进行身份验证 应用程序
  • 如何从 Newlib 在 GCC 中实现 printf?

    我正在努力使用 GCC 将 printf 从 newlib 正确实现到我的 esp32 中 我已经阅读了 newlib 文档 它为我提供了有关如何调用 printf 的一般信息 但没有向我解释后端实现 根据我当前的研究 我确定 printf
  • Jenkins 基于用户的工作安全

    我在本地计算机上只有一个 jenkins 实例 我们用它来构建代码 我们有不同的项目团队从事不同的项目 每个项目都有不同的工作 为了消除一个团队中的某人意外搞乱另一个团队工作的可能性 我创建了多个 jenkins 用户 但是 所有可以登录的
  • Sqlite 中的 acos 函数

    我有一个关于 SQLite 查询的问题 我需要执行这样的 sqlite 查询 SELECT id 6371 acos cos radians 78 3232 cos radians lat cos radians lng radians 6
  • 在 Android (JAVA) 中的字符串上使用 XPath

    我正在寻找一些在 Android 中使用 xpath 的示例 或者谁能 分享一下他们的经历 我一直在努力解决这个问题的尾部或头部 我有一个包含标准 xml 文件的字符串 我相信我需要将其转换为 xml 文档 我发现这段代码我认为可以解决问题
  • 如何让 2 个 HtmlUnit Web 客户端使用相同的 cookie?

    如果我在不同的线程中创建 2 个 WebClient 如何让它们使用相同的 cookie 您可以使用以下代码 CookieManager cookieManager new CookieManager webClient1 setCooki
  • 无法将 NSTaggedPointerString 类型的值转换为 NSDictionary

    我正在尝试将 Firebase 值分配给我的结构 var productsArray Product 但是我有一个小错误 无法将 NSTaggedPointerString 类型的值转换为 NS字典 我知道我不能直接分配它们 所以这就是我这
  • NOT IN 不会产生与 NOT EXISTS 相同的结果

    这些都是相当基本的陈述 我有一个链接到另一个表中的项目的图形列表 我想检查有多少图形没有使用并且理论上可以删除 所以首先我使用了 NOT IN 子句 SELECT GraphicNr Graphicfile FROM dbo Graphic
  • 对哈希进行排序的最快方法是什么?

    人们经常问什么是best方式对哈希进行排序 但随后他们不会询问所需的后续问题 即什么是fastest方式 这确实决定了最好的方式 无论使用什么版本的 Ruby 在 Ruby 中对哈希进行排序的最快方法是什么 我正在寻找其他答案 以涵盖极端情