gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:46 25 4
gpt4 key购买 nike

人们经常问什么是最好的排序散列的方法,但是他们不会问关于什么是最快的必要的后续问题,这确实决定了最佳方式。

无论使用的是哪个 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 操作系统笔记本电脑上运行以上代码会产生以下输出:

# >> 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

和:

# >> 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

和:

# >> 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选择使用内置 Benchmark为简单起见上课。

这是由“Sort hash by key, return hash in Ruby”提示的。

关于ruby - 对哈希进行排序的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31123483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com