ruby - 迭代散列中的键的最快方法

标签 ruby arrays hash benchmarking

我在 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)

我原以为将hash转成key数组会比较慢,其实不然,而且each_key的性能和each差不多。为什么是这样?什么是最好的方法?

最佳答案

查看some code on Github我可以告诉你两个字:视情况而定。如果您的变量名是一个散列并不明显,那么使用 .each_pair 将使它变得明显(因为散列是键值对的集合)。如果您的变量名提到“哈希”,那么这是有道理的:hash.each |key, value|。像 hash.each_pair do |k| 这样将 1 个 block 参数传递给 `each_pair 是没有意义的,这会使代码看起来很困惑。

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

关于ruby - 迭代散列中的键的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26247361/

相关文章:

Jquery,当哈希值在 url 中时激活脚本

perl - 如何在 Perl 中使用 `lock_hash_recurse`?

ruby - 在 Ruby 中使用 OptionParse 强制强制命令行参数

Ruby 字符串剥离定义的字符

ruby - RFC2616 : Do I really need to set WWW_Authenticate when returning 401?

C++ 快速排序字母数组

php - 如何使用通过 jQuery 的 AJAX 发布请求 + php 发送的数组?

ruby - 无法使用 ruby​​ aws-sdk v2 在 S3 中创建存储桶

php - 如何用键计算数组值

用于跟踪重复项的 python 数据类型