Thursday, May 3, 2012

pairs vs ipairs

질문 : pairs 와 ipairs 의 차이?

설명
pairs는 내부의 hash 를 iterate 하고
ipairs는 1부터 시작하는 integer key를 iterate 한다.
(ipairs는 key 가 integer가 아닌 경우는 iterate 하지 못함)
다음 코드를 돌려보면 명확해짐

 print("=================")  
 local a = {10, 20, 30}  
 for i,v in ipairs(a) do print(v) end   

 print("~~~~~~~~~~~~~~~~~~~~~~")  
 for i,v in pairs(a) do print(v) end  

 print("=================")  
 local b = {[0]=10, 20, 30}  
 for i,v in ipairs(b) do print(v) end   

 print("~~~~~~~~~~~~~~~~~~~~~~")  
 for i,v in pairs(b) do print(v) end  

 print("==================")   

결과
=================
10
20
30
~~~~~~~~~~~~~~~~~~~~~~
10
20
30
=================
20
30
~~~~~~~~~~~~~~~~~~~~~~
20
30
10
==================

코드
 numArray = {"One", "Two", "Three"}  
 revNumArray = {}  
 for k, v in pairs(numArray) do  
      revNumArray[v] = k  
 end  
 print("--pairs(numArray)----------------------------")  
 for k, v in pairs(numArray) do  
      print(k .. " : " .. v)  
 end  
 print("--pairs(revNumArray)----------------------------")  
 for k, v in pairs(revNumArray) do  
      print(k .. " : " .. v)  
 end  
 print("~~ipairs(numArray)~~~~~~~~~~~~~~~~~~~~~~~~~~")  
 for k, v in ipairs(numArray) do  
      print(k .. " : " .. v)  
 end  
 print("~~ipairs(revNumArray)~~~~~~~~~~~~~~~~~~~~~~~~~~")  
 for k, v in ipairs(revNumArray) do  
      print(k .. " : " .. v)  
 end  

결과
--pairs(numArray)----------------------------
1 : One
2 : Two
3 : Three
--pairs(revNumArray)----------------------------
One : 1
Three : 3
Two : 2
~~ipairs(numArray)~~~~~~~~~~~~~~~~~~~~~~~~~~
1 : One
2 : Two
3 : Three
~~ipairs(revNumArray)~~~~~~~~~~~~~~~~~~~~~~~~~~

기타 :
실제 benchmark 해본 결과 ipairs보다 pairs가 더 빨랐다는 실험결과도 있음
I'm surprised that (as my colleague pointed out to me), in plain Lua, pairs is faster than ipairs.
http://lua-users.org/lists/lua-l/2009-11/msg01018.html

No comments:

Post a Comment