【问题标题】:Fastest way to iterate over the keys in a hash迭代哈希中键的最快方法
【发布时间】:2014-12-02 13:12:29
【问题描述】:

我在this question 中初始化了一个哈希并运行了一些基准测试。

Benchmark.measure { a = h.keys }
#=>  0.010000   0.000000   0.010000 (  0.019832)
Benchmark.measure { a.each { |k| } }
#=>  0.060000   0.000000   0.060000 (  0.057262)
Benchmark.measure { h.each { |k, v| } }
#=>  0.320000   0.000000   0.320000 (  0.319768)
Benchmark.measure { h.each_key { |k| } }
#=>  0.310000   0.000000   0.310000 (  0.312656)
Benchmark.measure { h.each_pair { |k, v| } }
#=>  0.330000   0.000000   0.330000 (  0.331452)

我曾认为将散列转换为键数组会更慢,但事实并非如此,each_key 的性能与each 相似。为什么是这样?最好的方法是什么?

【问题讨论】:

  • 最好的方法是什么?不用担心,因为如果您的代码块中有实际代码,它不会成为您的瓶颈。
  • 请注意,a.each { |k| } 所做的事情与其他人非常不同:它不返回键,而是键值对。
  • 我的答案是您想要的吗?

标签: ruby arrays hash benchmarking


【解决方案1】:

看着some code on Github我可以告诉你两个字:这取决于。如果您的变量名称是散列并不明显,那么使用.each_pair 将使其显而易见(因为散列是键值对的集合)。如果您的变量名称提到“哈希”,那么这是有道理的:hash.each |key, value|。像hash.each_pair do |k| 这样将 1 个块参数传递给 `each_pair 是没有意义的,这会使代码看起来很混乱。

通过分析 Github 上的几个页面,我很想得出结论,“最佳方法”是在使用 .each 时,您应该将块变量命名为 |key, value| 以使您非常明显地迭代哈希(块参数会给你一个线索它是一个哈希)。使用.each_pair 时,您可能会更模糊地命名像|my_key_1, my_key_2| 这样的块参数,因为.each_pair 表示您正在迭代哈希。这一切都是为了在 1 周(或一个月)后查看您的代码,并能够立即知道发生了什么。与 Python 不同,Ruby 没有“一种正确的方法”来做某事。

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2015-09-25
    相关资源
    最近更新 更多