on1ystar 머릿속을 정리, 기록하는 곳

Python 2차원 리스트를 1차원 리스트로 만들기



프로그래머스에서 소개한 방법들의 속도 비교

(개인적인 흥미로 시작해 지극히 매우 심플한 방법을 사용했기 때문에 다소 오차가 있을 수 있음)

참고 : https://programmers.co.kr/learn/courses/4008/lessons/12738

import time

my_list = [[1]*1000]*1000
answer = []

# 방법 0 - 기존에 이용한 방법
start = time.time()
for l in my_list:
  answer += l
print('방법 0 : ', time.time() - start)

# 방법 1 - sum 함수
start = time.time()
answer = sum(my_list, [])
print('방법 1 : ', time.time() - start)

# 방법 2 - itertools.chain
import itertools
start = time.time()
list(itertools.chain.from_iterable(my_list))
print('방법 2 : ', time.time() - start)

# 방법 3 - itertools와 unpacking
import itertools
start = time.time()
list(itertools.chain(*my_list))
print('방법 3 : ', time.time() - start)

# 방법4 - list comprehension 이용
start = time.time()
[element for array in my_list for element in array]
print('방법 4 : ', time.time() - start)

# 방법 5 - reduce 함수 이용1
from functools import reduce
start = time.time()
list(reduce(lambda x, y: x+y, my_list))
print('방법 5 : ', time.time() - start)

# 방법 6 - reduce 함수 이용2
from functools import reduce
import operator
start = time.time()
list(reduce(operator.add, my_list))
print('방법 6 : ', time.time() - start)

# 방법 7 - numpy 라이브러리의 flatten 이용
import numpy as np
start = time.time()
np.array(my_list).flatten().tolist()
print('방법 7 : ', time.time() - start)

1회

방법 0 :  0.008287191390991211
방법 1 :  9.104264259338379
방법 2 :  0.021535873413085938
방법 3 :  0.04854297637939453
방법 4 :  0.032407522201538086
방법 5 :  4.629791259765625
방법 6 :  4.57472038269043
방법 7 :  0.2936990261077881

빠른 
0 > 2 > 4 > 3 > 7 > 6 > 5 > 1

2회

방법 0 :  0.04493212699890137
방법 1 :  9.691876888275146
방법 2 :  0.018207788467407227
방법 3 :  0.012559652328491211
방법 4 :  0.08371281623840332
방법 5 :  4.203353404998779
방법 6 :  4.327386140823364
방법 7 :  0.2877466678619385

빠른 
3 > 2 > 0 > 4 > 7 > 5 > 6 > 1

3회

방법 0 :  0.008169412612915039
방법 1 :  9.387500286102295
방법 2 :  0.06795668601989746
방법 3 :  0.012067079544067383
방법 4 :  0.029344797134399414
방법 5 :  4.308690071105957
방법 6 :  4.545395612716675
방법 7 :  0.22228121757507324

빠른 
0 > 3 > 4 > 2 > 7 > 5 > 6 > 1

4회

방법 0 :  0.0073964595794677734
방법 1 :  9.058513879776001
방법 2 :  0.026671648025512695
방법 3 :  0.011939048767089844
방법 4 :  0.08460307121276855
방법 5 :  4.1135642528533936
방법 6 :  4.199901342391968
방법 7 :  0.15093326568603516

빠른 
0 > 3 > 2 > 4 > 7 > 5 > 6 > 1

대충 평균을 내어 정리해 보자면

방법 0이 제일 빠르고,

근소한 차이로 3 > 2 > 4 순,

다음은 방법 7,

—넘사벽—

5 > 6

마지막으로 방법 1이 제일 느렸다.

즉 리스트 연산을 할 때 sum()reduce() 사용은 지양하는 것이 좋아보임

그냥 개인적으로는 for 문을 이용해 더하는 방식이 제일 심플하고 빠르기 때문에 앞으로도 사용할 예정

물론 어디까지나 알고리즘 문제 풀이에 제한된 아주 개인적인 의견

다시 한 번 강조하지만, 테스트 횟수가 10회 미만으로 매우 적고, 테스팅 환경 통제 등을 일체 하지 않았기 때문에 크게 의미없는 결과일 수 있으며, 이유에 대해서는 더 공부해봐야 할 것 같다.