최근 파이썬 알고리즘을 풀다가 리스트 초기화 방법에 따른 속도 차이가 궁금해졌습니다.
그래서 간단히 코드를 작성하여 속도를 테스트해보기로 했습니다.
리스트 초기화 방법은 여러가지가 있는데, 그 중 가장 빠른 2가지 방법을 2가지 조건으로 각각 테스트 하기로 했습니다. 테스트할 대상은 다음과 같습니다.
# 특정값으로 초기화
my_list = [k for i in range(n)]
# 0~n-1으로 초기화
my_list = [k for i in range(n)]
# 특정값으로 초기화
my_list = [k] * n
# 0~n-1으로 초기화
my_list = [0] * n
for i in range(n):
my_list[i] = i
테스트에 사용한 코드는 다음과 같습니다. 10부터 10을 곱해가며 1,000,000까지 각각 100번씩 테스트 했습니다.
import time
def timeit(f):
def timed(*args, **kwargs):
start = time.perf_counter()
for _ in range(100):
f(*args, **kwargs)
end = time.perf_counter()
return end - start
return timed
@timeit
def list_comprehension_by_zero(n,k):
"""List comprehension"""
my_list = [k for i in range(n)]
@timeit
def integer_multiplication_by_zero(n,k):
"""List and integer multiplication"""
my_list = [k] * n
@timeit
def list_comprehension_by_n_range(n):
"""List comprehension"""
my_list = [n for i in range(n)]
@timeit
def integer_multiplication_by_n_range(n):
"""List and integer multiplication"""
my_list = [0] * n
for i in range(n):
my_list[i] = i
import pandas as pd
import math
idx = [10 ** i for i in range(1,7)] # 10 ~ 1,000,000
def pre_treat(num): # 인덱스 전처리 함수
return int(math.log10(num))
idx_for_index = list(map(pre_treat,idx))
df = pd.DataFrame([(list_comprehension_by_n_range(n),integer_multiplication_by_n_range(n)) for n in idx],
index = idx_for_index,
columns=['list_comprehension_by_n_range', 'integer_multiplication_by_n_range'])
df.plot(figsize=(20,10))
df2 = pd.DataFrame([(list_comprehension_by_k(n,n),integer_multiplication_k(n,n)) for n in idx],
index = idx_for_index,
columns=['list_comprehension_by_k', 'integer_multiplication_k'])
df2.plot(figsize=(20,10))
y축은 시간(초), x축은 log n이다.
list_comprehension_by_n_range | integer_multiplication_by_n_range | |
---|---|---|
1 | 0.000091 | 0.000093 |
2 | 0.000395 | 0.000508 |
3 | 0.004054 | 0.005597 |
4 | 0.042756 | 0.058607 |
5 | 0.487338 | 0.643047 |
6 | 5.381698 | 8.065462 |
list_comprehension_by_k | integer_multiplication_k | |
---|---|---|
1 | 0.000093 | 0.000023 |
2 | 0.000401 | 0.000044 |
3 | 0.004017 | 0.000260 |
4 | 0.041812 | 0.002431 |
5 | 0.483890 | 0.032854 |
6 | 5.406347 | 0.431530 |
특정 값으로 초기화할 때는 list comprehension이 무척 느렸지만 0~n-1의 값(range를 이용한 값?)으로 초기화할 때에는 list comprehension이 더 빨랐습니다.
앞으로는 경우에 따라 잘 골라 써야겠다.