파이썬 dict list 차이

조회수 615회

파이썬에서 리스트와 딕트의 호출 방식에 대해 궁금한게 있습니다.

개인적으로 dict와 리스트 객체 호출방식이 동일하다고 생각했었는데, 예상과는 전혀 다른 결과가 나왔습니다.

리스트와 딕트 모두 반복을 통해서 일치하는 값을 발견하면 그때 결과를 리턴하는줄 알았는데, 딕트호출이 리스트 호출(?)보다 더 빠르게 되는 것을 확인했는데, 어떻게 이런 차이가 발생할 수 있는걸지 궁금합니다.

일치하는 값을 찾아낸다는 점에서 동일한 과정을 거치는게 아닌가요??

from time import time

l = range(99999)
t = time()
for i in l:
    if i == 90000:
        a = i
        break
print(time() - t)
>>> 0.006998300552368164
d = {}
for i in l:
    d[i] = 99999999999999999999999999999999999999999999999999
t = time()
a = d[90000]
print(time() - t)
>>> 0

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기
    >>> l = list(range(10**7))
    >>> s = set(l)
    >>> 10**7 in l
    False
    >>> 10**7 in s
    False
    
    >>> import time
    >>> def test_list_find():
        t0 = time.time()
        for _ in range(100):
            b = 10**7 in l
        print(time.time() - t0)
    
    
    >>> def test_set_find():
        t0 = time.time()
        for _ in range(100):
            b = 10**7 in s
        print(time.time() - t0)
    
    
    >>> test_list_find()
    9.505547761917114
    
    >>> test_set_find()
    0.0
    >>> 
    

    리스트와 셋을 비교해 볼께요.

    동일한 크기의 리스트와 셋을 만들고, 어떤 값이 리스트/셋에 있는지를 판별해 보는 겁니다. 시간차를 확인하기 위해서, 이걸 동작을 반복해서 시간을 쟀습니다.

    리스트에서의 멤버쉽 체크가 훨씬 오래 걸려요. 리스트에서는 원소 하나하나를 꺼내서 비교하는 식으로 체크를 할 겁니다. 그래서, 리스트의 크기에 비례해서 시간이 걸릴 거에요. 하지만 셋은 hash table 로 구현되어 있기 때문에, 좀더 효율적으로 검색을 한다고 합니다. 구체적인 구현은 필요하면 공부하시면 됩니다. 전 대충 소팅된 인덱스가 있고, 그걸 바이너리서치 하겠구나 하고 넘어갔습니다.

    딕셔너리에서는 키가 존재하냐 아니냐가 반복적으로 매우 중요하게 쓰이기 때문에, 딕셔너리의 키는 리스트가 아닌 셋으로 만들어져 있을거고요. 그래서 다르겠죠.

    리스트와 셋의 서치시간은, 데이터베이스에서 인덱싱을 한 테이블과 안한 테이블에서의 검색과 거의 똑같아요. 인덱싱 안 걸고 검색하면 어플리케이션 엄청 느려지죠. 그렇습니다.

    • 탐색 방식이 달랐군요.. 별 차이 없겠지하는 생각에 리스트를 사용해왔었는데 가능하면 앞으로는 딕셔너리를 써야겠네요. ㅠㅠ 감사합니다! 초보자 2021.12.7 13:40

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)