[Python] 리스트 초기화 속도 차이

bluejoy·2021년 7월 4일
1

파이썬

목록 보기
1/4
post-thumbnail

최근 파이썬 알고리즘을 풀다가 리스트 초기화 방법에 따른 속도 차이가 궁금해졌습니다.
그래서 간단히 코드를 작성하여 속도를 테스트해보기로 했습니다.

테스트

리스트 초기화 방법은 여러가지가 있는데, 그 중 가장 빠른 2가지 방법을 2가지 조건으로 각각 테스트 하기로 했습니다. 테스트할 대상은 다음과 같습니다.

  • list comprehension
# 특정값으로 초기화
my_list = [k for i in range(n)] 

# 0~n-1으로 초기화
my_list = [k for i in range(n)] 
  • integer multiplication
# 특정값으로 초기화
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이다.

  • 0~n-1으로 초기화
list_comprehension_by_n_rangeinteger_multiplication_by_n_range
10.0000910.000093
20.0003950.000508
30.0040540.005597
40.0427560.058607
50.4873380.643047
65.3816988.065462
  • 특정 값으로 초기화 (값이 달라져도 속도는 똑같음)
list_comprehension_by_kinteger_multiplication_k
10.0000930.000023
20.0004010.000044
30.0040170.000260
40.0418120.002431
50.4838900.032854
65.4063470.431530

특정 값으로 초기화할 때는 list comprehension이 무척 느렸지만 0~n-1의 값(range를 이용한 값?)으로 초기화할 때에는 list comprehension이 더 빨랐습니다.

앞으로는 경우에 따라 잘 골라 써야겠다.

참고

profile
개발자 지망생입니다.

0개의 댓글