迭代哈希中密钥的最快方法

时间:2014-10-08 00:23:15

标签: 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)

我原以为将哈希变成一个键数组会更慢,但事实并非如此,而each_key的性能与each相似。为什么是这样?什么是最好的方法?

1 个答案:

答案 0 :(得分:0)

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

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