Python 2차원 리스트를 1차원 리스트로 만들기
17 Jan 2021프로그래머스에서 소개한 방법들의 속도 비교
(개인적인 흥미로 시작해 지극히 매우 심플한 방법을 사용했기 때문에 다소 오차가 있을 수 있음)
참고 : 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회 미만으로 매우 적고, 테스팅 환경 통제 등을 일체 하지 않았기 때문에 크게 의미없는 결과일 수 있으며, 이유에 대해서는 더 공부해봐야 할 것 같다.