새소식

Programming/python

[python3] dict vs if else vs list

  • -

궁금해서 직접 테스트한 결과를 기록합니다.

 

import timeit

# test 용 get 함수. 의미 없으니 분석 불필요
def get(p1, p2, p3, p4):
    return p1+p3+p4 if isinstance(p4, int) else p1+p3+sum(p4)

# dict version
def set1(p1, p2, p3=44100):
    sig = {0: p1, 2: get(p1, p3, 1001, [90, 9000])}
    return sig.get(p2, get(p1, p3, 1001, 90))

# if else version
def set2(p1, p2, p3=44100):
    if p2 == 0:
        pass
    elif p2 == 1:
        sig = get(p1, p3, 1001, 90)
    elif p2 == 2:
        sig = get(p1, p3, 1001, [90, 9000])
    else:
        sig = get(p1, p3, 1001, 90)
    return sig

# list version
def set3(p1, p2, p3=44100):
    l1 = [p1, get(p1, p3, 1001, 90), get(p1, p3, 1001, [90, 9000]), get(p1, p3, 1001, 90)]
    return l1[p2]

# 목록에 있는 경우
timeit.timeit("set1(10, 2)", setup="from __main__ import set1, set2, set3", number=1000)
# 0.004073153000717866
timeit.timeit("set2(10, 2)", setup="from __main__ import set1, set2, set3", number=1000)
# 0.0061055079986545024
timeit.timeit("set3(10, 2)", setup="from __main__ import set1, set2, set3", number=1000)
# 0.010439659001349355

# 목록에 없는 경우
timeit.timeit('set1(10, 4, 44100)', setup='from __main__ import set1, s2, s3', number=1000)
# 0.009762813999259379
>>> timeit.timeit('set2(10, 4, 44100)', setup='from __main__ import set1, s2, s3', number=1000)
# 0.0013289130001794547
timeit.timeit('set3(10, 4, 44100)', setup='from __main__ import set1, s2, s3', number=1000)
"""
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.7/timeit.py", line 232, in timeit
    return Timer(stmt, setup, timer, globals).timeit(number)
  File "/usr/lib/python3.7/timeit.py", line 176, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
  File "<stdin>", line 3, in set3
IndexError: list index out of range
"""

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.