강승현입니다
    • 홈
    • 태그
    • 방명록

    카테고리

    • 전체 글 (118) N
      • 후기 (38)
        • 경험 (15)
        • SSAFY (9)
        • 코딩테스트 (3)
        • 넥스터즈 (6)
        • 회고 (5)
      • Degrees (2)
      • Tech (33) N
      • OnlineJudge (45)
    Tech

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

    CODe_byCODe_·2021. 2. 5. 00:19


    무엇을 경험했나?

    백준 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를 받는지가 결정되었습니다. 


    반응형
    저작자표시 비영리 변경금지 (새창열림)
    'Tech' 카테고리의 다른 글
    • [Java] Error와 Exception에 대해
    • Python3 나누기연산(/)과 시프트연산(>>)의 속도 차이를 알아보자
    • [JAVA 기초] 1. JAVA의 특징
    • 세그먼트 트리(Segment Tree) 알고리즘
    CODe_
    CODe_
    개발과 관련된 다양한 정보를 몰입감있게 전달합니다.
    최신 글

    티스토리툴바