파이썬) 객체 type별 루프문 속도 비교(Comparison set, list, tuple, dict for loop speed)

하얀설표 | 작성시간 2024.12.18.

(2024.12.18. 수정됨.)

파이썬은 다양한 type의 객체들을 loop할 수 있습니다. list, tuple, dict는 물론, str type도 루프하는게 가능한데요.
type별로 loop 속도는 똑같을까요?? 궁금해서 테스트해봤습니다.

먼저 각각의 type별로 n개의 집합을 만든 다음, 동일한 조건으로 루프를 종료하는 코드들을 작성했습니다.
각각 range, list, tuple, set, dict, generator를 사용해서 for loop문을 실행하게 됩니다. 겸사겸사 pandas의 loop도 함께 테스트했는데요.
어떤 type이 loop 속도가 가장 빨랐을까요?

결과는 list와 tuple의 loop 속도가 제일 빨랐습니다.
list가 더 빠를 때도 있고, tuple이 더 빠를 때도 있었습니다. set도 그에 못지 않게 빠른 속도를 보여주고 있구요.
그리고 dict.items()로 loop했을 때 소요되는 시간이 dict.keys()나 dict.vlaues()를 사용했을 때의 2배 정도라는 것도 의외였습니다.

속도를 기준으로 정리하면 list or tuple > set > dict > dict.keys() > dict.values() > range > dict(call) > dict.itmes() > dict.get() 순이었습니다.

판다스의 경우에는 loop 속도가 처참했지만, 벡터화(vectorization)를 이용한 경우에는 루프하는 것보다 더 빠른 속도를 보여준다는 것을 확인할 수 있었습니다.

enumerate는 얼마나 빠를까?

list를 loop할 때, 특정 요소의 index가 함께 필요할 때가 있습니다.
index를 얻는 방법은 다양하지만, 보통 파이썬 내장 함수인 enumerate를 사용하고 있는데요.

enumerate 대신 list 객체에 요소의 index를 요청하거나, list의 갯수만큼 range를 만드는 방법도 있는데, 어느 것이 빠를지 궁금해졌습니다.

결과는 list에 포함된 요소 갯수를 센 다음, range를 이용해 loop하는 것이 가장 빨랐고, list 객체에 index를 요청하는 것은 끔찍할 정도로 느렸습니다.

속도를 기준으로 정리하면 range(len(list)) > enumerate > zip(range, list) > list(range) >>>>> list.index()였습니다.
range(len(list))의 경우 enumerate를 사용하는 것 보다 번거로운 방법이라고 생각되는데, 속도는 enumerate보다 20% 정도 빠른 것이 의외의 결과였습니다.

loop할 때 type을 변경하면 어떻게 될까?

개인적으로 list(range(n))은 자주 사용하는 편입니다.
그런데 방금 enumerate와 비교하면서 range만 사용했을 때와, range를 list로 변환해서 사용했을 때의 속도가 다르다는 것을 알게 되었는데요.

이런 경우에는 얼마나 시간이 더 걸리는지 확인해봤습니다.

결과는 대체로 미묘한 차이이긴 했지만, loop할 때 type을 변경하면 작업시간이 더 늘어났습니다.
특히 dict.items()를 list로 감싸서 작업을 수행하면 거의 10배에 가까운 시간을 잡아먹는다는 사실도 알게 되었구요.

특별한 이유 없이 변수를 다른 type으로 변경하는 것은 작업시간을 늘릴 뿐이라는 것을 알게 되었습니다.

간단 정리

  • 객체 type마다 loop 속도는 다르고, list와 tuple가 가장 빠르다.
  • 각 type마다 loop 속도가 다르긴 하지만, 그렇게 큰 차이는 나지 않는다.
  • dict의 경우 for i in dict() 또는 dict().keys(), dict().values() 명령으로 loop하는게 빠르다., for k, v in dict().items()를 하면 2배의 시간을 잡아먹는다.
  • range, tuple, dict를 list로 변경하는 것은 시간을 잡아먹는다. 특히, list(dict.items())를 하게 되면 엄청난 시간을 들여야 한다.

테스트 코드 : https://github.com/white-seolpyo/for-loop-speed-compare/tree/main



이 글의 댓글 기능은 일부러 막아놓았습니다. 궁금한 내용이 있다면 게시판을 이용해주세요!