2014-10-08 69 views
2

我初始化了一個散列,如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

什麼是最好的方法?不用擔心,因爲如果你的代碼塊中有實際的代碼,它不會成爲你的瓶頸。 – 2014-10-08 01:01:55

+2

請注意'a.each {| k | }'做了與其餘部分截然不同的事情:它不返回鍵,而是鍵值對。 – Amadan 2014-10-08 01:08:47

+0

我的回答是你在找什麼? – daremkd 2014-10-13 23:06:26

回答

0

看着some code on Github我可以告訴你2個字:這要看。如果變量名稱不是一個明顯的哈希值,那麼使用.each_pair會使其變得明顯(因爲哈希是鍵值對的集合)。如果你的變量名稱提到'哈希',那麼這是有道理的:hash.each |key, value|。這樣做是沒有意義的,像hash.each_pair do |k|這樣你傳遞1個block參數給'each_pair,它會使代碼看起來很混亂。在分析Github上的幾個頁面時,我試圖得出結論:「最佳方法」是在使用.each時,應該命名塊變量|key, value|,使其非常明顯地表明您正在迭代散列(塊參數會給你一個線索,它是一個散列)。當使用.each_pair時,由於.each_pair指出您正在迭代散列,因此您可能會更加模糊地指定|my_key_1, my_key_2|這樣的塊參數。這一切都是關於一週(或一個月)後查看你的代碼,並能夠立即告訴發生了什麼。與Python不同,Ruby沒有「一個正確的方式」去做某件事。