Zero to Hero
article thumbnail

요즘 코딩 테스트 광탈을 Python으로 면하자는 콘셉트의 자료(게시글, 강의, 책)가 많이 보인다. 지난 1년간 코딩 테스트에 Python을 사용하면서 느낀 점과 주의할 점을 공유해보려 한다.

 

 

1. 속도

Python 관련해서 가장 많이 언급되는 부분 중 하나가 속도다. 결론부터 말하면 평균적으로 속도가 느리고, 그 속도를 가늠하기 쉽지 않다. 여기서 말하는 가늠하기 쉽지 않다는 것은 개략적인 시간 복잡도를 판단하는 것이 아닌 실제로 채점 사이트에 나오는 속도(ms)를 말한다.

 

Python은 컴파일러(Compiler)가 아닌 인터프리터(Interpreter) 언어이다. 뿐만 아니라 언어 구조상 코딩 테스트에 주로 사용되는 C++/Java에 비해 속도가 느리다. (언어 구조 및 원리에 대해선 추후 포스팅 예정)

 

또 위에서 "속도를 가늠하기 쉽지 않다"라고 언급했다. 실제로 동일한 코드를 동일한 채점 사이트에 제출하고 속도를 측정했을 시 적게는 50, 많게는 1000ms까지 변하는 것을 확인했다.

 

물론 실제로 일반적인 기업의 입사 코딩 테스트 수준에서 접하는 문제들은 언어와 상관없이 적합한 알고리즘과 로직을 사용했을 때 통과할 수 있도록 제한을 두기 때문에 대부분의 경우에는 문제가 없다.

 

하지만 온라인 저지에서 문제를 푸는 경우는 입력을 받는 방식(표준 입출력, 파일 입출력)에 따라서, 또는 정말로 언어 자체의 속도 때문에 다른 언어와 동일한 알고리즘을 사용함에도 불구하고 시간 초과가 날 때가 있다. 실제로 이런 문제들에 대해서 질문 게시판의 질문과 댓글을 보면 랭커분들이 "Python이 느려서 그래요."라는 답변을 달아주시곤 한다.

 

2. 메모리

Python은 재귀(Recursion)의 깊이가 타 언어에 비해 낮다. 예를 들어 타 언어가 아무런 문제 없이 100000번의 depth로 재귀 처리를 할 수 있다면 Python은 그것이 세팅을 해주지 않고서는 불가능하다.

 

그리고 세팅을 통해서 재귀의 depth를 늘려줬다 하더라도 몇 가지 문제가 발생할 수 있다. Python 코드를 제출할 때 Python3 혹은 pypy3 중 하나를 골라서 채점을 받을 수 있다.

두 채점 환경의 차이는 요약하면(극단적으로), pypy3는 Garbage Collecting를 포기해 메모리 관리를 포기한 대신 속도를 얻었고, Python3는 그 반대라고 생각하면 된다. 

 

아래는 백준에서 동일한 코드로 제출하고 PASS를 받은 결과이다. 메모리를 보면 거의 3배 가까이 차이가 난다. 이런 문제 때문에 구현, 특히 시뮬레이션에서 DFS 기반의 코드 같은 경우는 속도가 일반적으로 더 빠른 pypy3에선 메모리 초과로 통과를 하지 못하지만 Python3 에선 통과하는 현상이 종종 발생한다. 심지어 위 결과에선 Python이 pypy3보다 속도마저 빠르다. 속도 관련해서 작성한 "가늠하기 어렵다"라는 것이 이 뜻이다.

 

3. 결론

사실 Python을 코딩 테스트 언어로 사용하면서 이런 경우를 겪고 있다는 것은 본인의 실력이 어느 정도 올랐다고 생각해도 좋다. 하지만 코딩 테스트를 이제 준비하는 분들이라면 단순히 코딩 테스트를 위해서 Python을 공부하는 것은 매우 비효율적이라고 생각한다. 본인이 사용하는 주 개발 언어가 C++/Java 중 하나이고, 본인의 진로가 해당 언어를 사용하는 직군으로 방향을 잡았다면 "생산성", "사용하기 편한" 이런 수식에서 휩쓸리지 말고 사용하던 언어의 숙련도를 높여서 전문성을 기르는 게 훨씬 건설적이라고 생각한다.

profile

Zero to Hero

@Doljae

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!