프로그래머스에서 코딩 테스트 입문에 있는 'n의 배수 고르기' 문제를 풀다가 한 가지 의문이 생겼다
https://school.programmers.co.kr/learn/courses/30/lessons/120905
lambda를 이용한 리스트 내 요소 필터링이 빠를까 ?
리스트 컴프리헨션(list comprehension)을 통한 요소 선별이 더 빠를까?
어딜 찾아봐도 따로 설명해주는 포스트나 문서를 찾지 못해서
그냥 내가 실험해보기로 했다 ... 😵
우선 프로그래머스에서 마주한 문제는 다음과 같다
Q. 정수 n과 정수 배열 numlist가 매개변수로 주어질 때, numlist에서 n의 배수가 아닌 수들을 제거한 배열을 return하도록 solution 함수를 완성해주세요.
[입력 예]
n = 3
numlist = [4,5,6,7,8,9,10,11,12]
[출력 예]
[6,9,12]
위 문제를 풀기 위해서 내가 list comprehension을 사용해 작성한 알고리즘은 다음과 같다
def solution(n, numlist):
return [i for i in numlist if i % n == 0]
그리고 다른 사람의 풀이를 통해 확인한 lambda를 사용해 작성한 알고리즘은 다음과 같다
def solution(n, numlist):
return list(filter(lambda v: v%n==0, numlist))
얼핏보면 큰 차이가 없어보인다.
하지만 코드를 보면 list comprehension은 명시적으로 for문을 도는 것을 알 수 있다
그에 반해 lambda는 filter 함수를 통해 자체적인 요소 선별기능을 제공하기 때문에, 내장함수인 filter를 이용한 'lambda가 더 빠르지 않을까?'라는 생각이 들게 한다
😮
하지만 정확한 프로스세와 결과는 모르기 때문에
그래서 아주 긴 길이의 데이터를 준비해서 직접 비교하기로 했다!
실험 코드는 다음과 같다
아래 코드에서 D는 데이터의 개수로, 실험을 할 때마다 직접 숫자를 바꿔가며 넣어주었다!
import time
import random
def solution_lambda(n, numlist):
return list(filter(lambda v: v%n==0, numlist))
def solution_listcomprehension(n, numlist):
return [i for i in numlist if i % n == 0]
n = 3
num_list = random.sample(range(1,10000000001), D) # D는 데이터의 개수로 유동적으로 바뀜
# solution_lambda
l_start = time.time()
solution_lambda(n, num_list)
l_end = time.time()
print("lambda:", l_end-l_start)
# solution_listcomprehension
c_start = time.time()
solution_listcomprehension(n, num_list)
c_end = time.time()
print("list comprehension:", c_end-c_start)
데이터의 개수 | lamda +filter 소요시간 |
list comprehension 소요시간 |
5 | 7.62939453125e-06 | 4.0531158447265625e-06 |
10 | 1.5020370483398438e-05 | 1.5497207641601562e-05 |
100 | 4.76837158203125e-05 | 3.910064697265625e-05 |
1,000 | 0.00029397010803222656 | 0.00016260147094726562 |
10,000 | 0.00670933723449707 | 0.0015730857849121094 |
100,000 | 0.21921110153198242 | 0.07184410095214844 |
1,000,000 | 0.6229641437530518 | 0.31955695152282715 |
데이터의 개수를 늘려가면서 반복적으로 확인해보니
lambda와 filter를 같이 사용한 경우보다
list comprehension을 사용하여 구현한 경우가 일반적으로 더 빠른 것을 확인할 수 있었다!
물론 모든 변수요인을 통제하며 실험을 한 것은 아니라서,
확답을 내릴 수는 없겠지만
대충 그렇구나~ 라고 생각하면 좋을 것 같다
결론 !
lambda를 이용하는 것도 좋지만, list comprehension가 쪼~금 더 빠른 것 같다!
하지만 어느걸 사용하나 그건 사용하는 사람의 자유 :)
왜 lambda가 더 느린지 알기 위해 ! llambda를 더 잘 이해하고 활용하기 위해 !
좀더 공부를 하고 추후에 python 카테고리에 관련 포스트를 업로드해봐야겠다 :)
'Dev > TIP 팁' 카테고리의 다른 글
[Book] 함께 자라기 | 애자일로 가는길 | 개인적인 성장과 협업을 위한 애자일 방법론 적용기 (1) | 2023.05.09 |
---|---|
[git] vscode에서 커밋 시 COMMIT_EDITMSG 열릴 때 : 해결 방법 (0) | 2023.03.26 |
[TIP] 컴퓨터 OS | 파일 시스템 | 터미널 환경의 기본 (0) | 2022.12.19 |
[TIP] 코드 깔끔하게 짜는 법/클린 코드/깨끗한 코드 (1) | 2020.07.16 |
[TIP] KoNLPY 사용시 jvm.dll 인식 오류 및 JAVA_HOME 설정 (0) | 2020.07.12 |