728x90

배경

백준 Floyd-Warshall 문제를 풀다가 시간초과가 발생했다. 시간초과 발생한 것을 보고 게시판을 찾아보면서, 내 코드와 비슷하지만, 정답을 맞은 코드를 보며 알고리즘을 비교했다. 알고리즘에는 차이가 없지만 if 문과 min 함수의 차이가 눈에 띄었다. 그리고 코드를 바꿔 풀어보면서 제목과 같은 의문을 갖게 되었다.

min 함수를 if문으로 바꿈

 

 

비교 코드

import time

if __name__ == '__main__':
    sim = 10**8

    s = time.time()
    for _ in range(sim):
        if 1 > 2:
            pass
    res1 = time.time()-s

    s = time.time()
    for _ in range(sim):
        max(1, 2)
    res2 = time.time()-s

    print('comparison : {:.2}s, max : {:.2}s'.format(res1, res2))

* 컴파일환경에 따라 차이가 더 나거나 덜 날 수 있습니다.

 

위와 같은 코드를 실행하면 다음과 같은 결과를 얻을 수 있다.

2개 항을 비교할 때 max함수를 $10^8$ 번 호출과 2개 항을 비교할 때 if문 $10^8$번 한 것이다.

 

2개의 요소를 비교

  • if : 1.6s
  • max : 5.9s

다음과 같이 약 3배 이상의 차이를 확인할 수 있다.

 

 

이유

if문은 단 하나의 연산자 ' > '를 통해서 직관적으로 값 비교 한 번만 하면 된다. 

max 함수는 max 함수라는 이름에 대한 dictionary 조회, max 함수 호출로 인하여 시간이 오래 발생한다.

 

하지만 위와 같은 시간은 2개의 요소를 비교할 때 이러한 현상이 발생하지만 요소의 수가 많아지다면 max 함수가 if문보다 이점이 커질 것이다.

 

결론

 

요소가 적다면 if문을 사용하고 요소가 충분히 많다면 max 함수 또는 min과 같은 함수를 사용해야 한다.

 

근데 min, max함수가 훨씬 깔끔해 보이긴 하는데..

 

 

출처 : https://stackoverflow.com/questions/56281691/why-is-max-function-so-much-slower-when-comparing-2-elements-vs-direct-compari

728x90