몸소 겪었던 Python과 PyPy의 차이(메모리,속도)
언어/Python

몸소 겪었던 Python과 PyPy의 차이(메모리,속도)

반응형


무엇을 경험했나?

백준 2263 트리 문제를 풀면서 경험했던 것을 공유하려 합니다.

RecursionError

sys.setrecursion(10**5) //pypy3에서는 정답, python3에서는 recursionError
sys.setrecursion(10**6) //pypy3에서는 메모리초과, python3에서는 정답

(21.03.05 추가)

분명 동일한 recursion 깊이인데 왜 pypy3는 정답이고 python3는 recursionError(깊이 초과)가 발생할까요?

pypy doc을 살펴보면 이렇게 설명되어 있습니다.

 

링크

 

pypy3에서는 정확한 크기를 할당하는 것이 아니라 대략적으로 크기를 할당하기 때문에 위와 같은 문제가 발생하게 됩니다.

 

메모리 초과(MLE) : write와 print 차이

sys.stdout.write(str(root)+" ") //pypy3에서 메모리초과
print(root+" ") //pypy3에서 정답

 

아이러니하죠. sys.stdout.write가 속도는 분명 더 빠릅니다. 하지만 시간초과가 아닌 메모리 초과를 받을 줄은 상상도 못했습니다.

아래 비교표를 보겠습니다. (출처:백준, 사용 메모리는 제가 추가했습니다.)

 

순위 언어 출력 방법 평균(초) 사용 메모리
1 pypy3 for i in range(1,n+1): sys.stdout.write(str(i)+'\n') 1.3722 더 많음
2 pypy3 for i in range(1,n+1): print(i) 3.051 더 적음

 

시간상으론 분명 빠른 것을 볼 수 있습니다. 하지만 시간뿐만 아니라 메모리 관리도 신경을 써야 하는데요. pypy3는 가비지 컬렉터가 python3와 다른 구조기 때문에 python3보다 더 많은 메모리로 사용된다고 합니다.(출처

 

 

pypy3 write는 메모리 초과, print는 Accepted

 

 

동일한 소스코드지만, python3와 pypy3의 메모리 사용량 차이가 어마어마합니다.

 

결과적으로 이 출력문 차이로 메모리 초과를 받는지, Accepted를 받는지가 결정되었습니다. 


반응형