본문 바로가기

일상+자잘한 일

[pypy/python] 같은 코드상에서 pypy가 python보다 메모리를 많이 먹는 이유

백준에서 문제를 풀다가 recursion error가 발생했고 메모리 제한을 풀다 문제를 발견하였다.

sys.setrcursionlimit(10**5)

위와 같은 코드로 recursion limit을 풀어주고 다시 제출하였더니 pypy에서는 메모리 초과를 받고 python에서는 통과했다.

 

내가 알고 있던 지식으로는 pypy가 JIT(just in time) 방식을 사용하기 때문에 필요한 부분을 즉석해서 컴파일하고 캐싱하며 인터프리터의 속도적 단점을 개선한 모델로 알고 있었는데 python에서만 합격을 받아 놀랬다.

 

이유를 찾아보니

  1. PyPy는 Generational Garbage Collector를 사용하는 반면 CPython은 Reference Counting과 간단한 세대별 가비지 컬렉션을 사용
  2. PyPy는 JIT (just in time) 컴파일 방식을 사용하는 반면 CPython은 바이트코드로 변환 후 인터프리터가 실행

쉽게 이야기해서 가비지 컬렉터의 작동 방식의 차이점과 JIT 컴파일 방식의 코드 캐싱 공간 사용으로 인한 메모리 사용량 증가가 있을 수 있다.

 

참조문서:

https://doc.pypy.org/en/latest/cpython_differences.html

https://stackoverflow.com/questions/45117672/pypy-large-memory-usage-compared-to-cpython

https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4

https://www.quora.com/What-is-the-difference-between-Python-and-PyPy