본문 바로가기

Dev/TIP 팁

[TIP/실험] lambda filter와 list comprehension의 속도 비교 | 프로그래머스 | n의 배수 고르기

728x90

프로그래머스에서 코딩 테스트 입문에 있는 'n의 배수 고르기' 문제를 풀다가 한 가지 의문이 생겼다

 

https://school.programmers.co.kr/learn/courses/30/lessons/120905

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

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 카테고리에 관련 포스트를 업로드해봐야겠다 :)

 

 

728x90