알고리즘 문제를 풀다가 임시 컨테이너 타입에 값을 넣고 정렬을 한 다음, 다시 추출을 해야되는 요구사항이 있었습니다. 이 때, 선택할 수 있는 컨테이너 타입이 리스트와 딕셔너리가 있었는데 이 둘 중, 어느 것을 사용하는게 더 빠른지 궁금증이 생겨 성능 비교를 한 결과를 공유합니다.

insert 성능 비교

다음 테스트 시나리오는 10000번 반복문을 실행하면서 리스트와 딕셔너리 각각에 값을 대입하는 것입니다. 리스트는 append()를 진행하고 딕셔너리는 key와 value를 동일한 값으로 대입합니다.

테스트를 진행할 때, 진행하는 현재 컴퓨터 상태에 따라 속도가 차이날 수 있으므로 테스트를 10000번씩 10번 반복하여 진행했습니다.

import timeit


def list_append():
    target = []
    for i in range(10000):
        target.append(i)
    return target

def dict_input():
    target = {}
    for i in range(10000):
        target[i]=i

    return target

def dict_update():
    target = {}
    for i in range(10000):
        target.update({i:i})

    return target

def dict_init():
    target = {i:i for i in range(10000)}
    return target


list_append_result = timeit.repeat('list_append()', setup='from __main__ import list_append', number=10000, repeat=10)
dict_input_result = timeit.repeat('dict_input()', setup='from __main__ import dict_input', number=10000, repeat=10)
dict_update_result = timeit.repeat('dict_update()', setup='from __main__ import dict_update', number=10000, repeat=10)
dict_init_result = timeit.repeat('dict_init()', setup='from __main__ import dict_init', number=10000, repeat=10)


print(list_append_result)
print(dict_input_result)
print(dict_update_result)
print(dict_init_result)

print(list_append_result / 10)
print(dict_input_result / 10)
print(dict_update_result / 10)
print(dict_init_result / 10)


# [9.368932351000694, 8.677124325000477, 11.322377628999675, 9.431962711001688, 10.857938523000485, 11.39016593999986, 8.786496071003057, 8.690530705000128, 8.783746272998542, 8.742622023000877]
# [6.620657838000625, 6.680011296000885, 6.664543662998767, 6.7046036060019105, 6.581820264000271, 6.711256531998515, 6.514346152998769, 6.726957429000322, 6.996250429998327, 7.4203126239990524]
# [26.679802045000542, 31.130167048002477, 25.514999765997345, 27.273101370003133, 25.172690123999928, 24.99170582899751, 24.88678633699965, 29.874651324000297, 26.50300300899835, 25.75833692300148]
# [6.653256032997888, 6.464788729997963, 6.341049987000588, 6.643497394998121, 6.490332034001767, 6.6258576170002925, 6.675058802997228, 6.447327537000092, 6.458141434999561, 6.562970161001431]

# 9.60518965510055
# 6.762075983499744
# 26.77852437750007
# 6.536227973199493


위 결과를 보자면, 딕셔너리를 update()하는 행동이 가장 느립니다. 리스트를 append 하는 행동과 딕셔너리에 키와 값을 input 하는 행동은 약 20~30% 차이가 납니다. 따라서, 방대한 양의 데이터를 입력해야 하는데 입력 순서가 크게 상관이 없다면 딕셔너리를 사용하는 것이 효율적입니다.