알고리즘 문제를 풀다
똑같은 코드인데도 Python3로 제출했을 때는 2832ms가 걸리던 것이, PyPy3로 제출했을 땐 472ms가 걸린 것을 본 나 ..
똑같은 파이썬 언어인데 왜 저렇게 시간복잡도에서 미친 효율을 보이는걸까?
🤔 Python3와 PyPy3의 차이
파이썬은 쉽고 직관적인 문법 덕분에 사용하기 쉬운 언어로 잘 알려져 있다. 덕분에 최근 몇 년동안 꾸준한 상승세를 보여왔고, 대표적인 프로그래밍 언어인 C와 Java의 점유율을 끈질기게 추격해왔다. 언어별 인기도 지수를 나타내는 티오베 지수에 따르면 지난 2021년 10월에는 파이썬이 결국 이 둘을 앞지르고 1위에 등극했다.
하지만 파이썬은 속도가 느린 언어라고 평가받기도 한다. 이를 해결하기 위해 다양한 시도를 해왔고, 이 과정에서 등장한 것이 Cython, IronPython, 그리고 PyPy다.
결론부터 말하자면 PyPy3는, Python3을 실행시 시간이 매우 오래 걸린다는 단점이 있어 그것을 개선하고자 JIT컴파일 방식을 도입해 만든 언어다.
💡JIT 컴파일 방식이란?
프로그램을 실행하기 전에 컴파일 하는 대신, 프로그램을 실행하는 시점에서 필요한 부분들을 즉석으로 컴파일 하는 방식
본격적으로 이 둘의 차이를 알아보자!
Python3
- CPython은 Python의 기본 구현체로, 인터프리터 방식이다. (이와 반대되는 개념으로 C와 Java 등의 컴파일 언어가 존재)
- 인터프리터 방식은 소스 코드를 한 줄씩 읽고 바로 실행하므로, 반복적인 작업이나 리스트를 다루는 연산이 많을 경우 성능이 떨어질 수 있다. (2중, 3중 for문같이 시간 복잡도의 효율이 중요한 코드일 수록 불리하다)
- 특히 for 루프와 pop 연산을 자주 사용하는 경우 시간이 많이 걸린다.
PyPy3:
- PyPy는 Python의 구현체 중 하나로, CPython과는 몇 가지 차이점이 있다.
- PyPy는 Python 코드를 JIT(Just-In-Time) 컴파일 방식으로 실행한다.
- 인터프리트 하면서 자주 쓰이는 코드를 캐싱하기 때문에 인터프리터의 느린 실행속도를 개선할 수 있다. (JVM에서도 바이트 코드를 기계어로 번역할 때 JIT 컴파일러를 사용한다)
- CPython보다 더 효율적인 가비지 컬렉션을 사용하여 메모리 사용량을 줄인다.
- 이러한 특성 때문에 PyPy는 Python3에 비해 반복문이 많거나 메모리 관리를 자주 해야 하는 프로그램에서 훨씬 더 성능이 좋다고 한다.
- 하지만, 코드를 저장할 공간이 필요하기 때문에 PyPy는 Python에 비해 메모리를 많이 사용한다는 단점이 있다. (위의 캡쳐본에서도 드러남)
💡컴파일 언어
컴파일러는 전체 코드를 한번에 기계어로 변환한다. 그래서 줄 단위로 번역을 진행하는 인터프리터에 비해 번역하는 시간은 오래 걸리는 편이다. 하지만, 한번 컴파일 할 때 실행 파일을 생성하기 때문에 코드를 재실행할 경우 해당 실행 파일을 실행하기만 하면 된다. 따라서 실행 시간은 인터프리터에 비해 빠른 편이다.
💡인터프리터 언어
인터프리터는 고급 언어를 위에서부터 한 줄씩 차례로 번역하면서 실행한다. 그렇기에 컴파일러에 비해 번역에 소모되는 시간이 적다. 하지만, 매 실행마다 코드를 번역해야 하기 때문에 일반적으로 인터프리터 언어는 실행 속도가 느린 편이다.
✏️ PyPy를 사용할 때의 주의사항
C 확장 지원 여부를 체크해봐야한다.
- numpy 같은 C로 작성된 확장 라이브러리는 PyPy에서 일부 호환성 문제가 있을 수 있다.
- (최근에는 numpy, scipy 등 주요 라이브러리에 대한 PyPy 지원이 많이 개선되고 있는 추세이다)
속도가 항상 Python보단 빠르지 않을 수도 있다.
- 단순한 스크립트나 I/O 작업 중심의 코드는 JIT 컴파일의 이점이 적어 CPython과 큰 차이가 없을 수도 있다.
✏️ 결론
즉! 정리하면 PyPy3에서는 실행 시 자주 쓰이는 코드들을 캐싱하는 기능이 있기 때문에 실행 속도를 개선할 수 있다. 그래서 반복이 자주 발생하는 코드에서는 PyPy3가 더 우세하다.
하지만, 이 경우 코드를 캐싱하면서 메모리를 조금 더 사용하기 때문에 반복이 없는 간단한 코드에서는 메모리, 속도 측에서 Python3가 우세할 수 있다.
특징 | CPython (표준 구현체) | PyPy |
성능 | 인터프리터 방식으로 실행, 상대적으로 느림 | JIT 컴파일러로 빠른 실행 속도 제공 |
호환성 | 표준 Python 라이브러리 및 C 확장 완벽 지원 | 일부 C 확장이 완벽히 지원되지 않을 수 있음 |
메모리 관리 | 일반적인 가비지 컬렉터 사용 | 메모리 효율을 더 잘 관리하는 가비지 컬렉터 사용 |
사용 목적 | 범용 Python 개발 | 계산 집약적인 작업 또는 속도 향상이 필요한 상황에 적합 |
배포 | 기본적으로 Python과 함께 제공 | 별도 설치 필요 |
References
https://velog.io/@seongmini/Python-Python%EA%B3%BC-PyPy
'Programming Languages > Python' 카테고리의 다른 글
[Python] zip과 dict로 리스트 2개 딕셔너리로 매핑하기 (feat. for문 탈출) (0) | 2024.12.17 |
---|---|
[Python] 파이썬에서의 집합, set 함수 (4) | 2024.08.12 |
[Python] 파이썬에서 최소 공배수 함수로 구하기 (0) | 2024.06.13 |
[Python] 리스트 append 와 extend의 차이 (2) | 2024.05.14 |
[Python] 알고리즘 문제 풀다 발견한 대소문자 바꾸기 메서드.. 우리의 시간을 아끼자 ^ㅡ^ (0) | 2024.05.13 |