2014-10-08 6 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_keyeach과 비슷한 성능을 가지고있다. 왜 이런거야? 가장 좋은 방법은 무엇입니까?

+1

가장 좋은 방법은 무엇입니까? 블록에 실제 코드가 있으면 병목 현상이 발생하지 않으므로 걱정하지 않아도됩니다. –

+2

'a.each {| k | }'는 나머지와 매우 다른 것을합니다 : 키는 반환하지 않지만 키 - 값 쌍은 반환합니다. – Amadan

+0

내 대답은 당신이 찾고 있던 것이 었나요? – daremkd

답변

0

some code on Github에서 보니 2 단어를 말할 수 있습니다. 변수 이름이 해시인지 확실하지 않으면 .each_pair을 사용하면 해시가 키 - 값 쌍의 모음이므로 명확하게 나타납니다. 변수 이름에 '해시'가 포함되어 있으면 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 주 (또는 한 달) 후에 코드를보고 무엇이 진행되고 있는지 즉시 알릴 수 있습니다. 파이썬과는 달리 루비는 무언가를 할 수있는 "올바른 길"을 가지고 있지 않습니다.

관련 문제