본문 바로가기

TIL

[TIL 2024. 04. 26] 파이썬이 느린 이유 | 데코레이터 | 파이썬 메모리 관리

파이썬이 느린 기술적 이유

 

파이썬이 다른 언어에 비해 느리다는 것은 사실이라고 생각한다.

비록 아주 짧은 시간의 차이이므로 우리가 체감하기는 어렵지만, 파이썬이라는 언어의 특성을 생각해보면 조금 느린 언어일 수밖에 없기 떄문이다

    • 인터프리터 언어 + 동적 타입 언어+PYTHON_GIL(메커니즘)
    • Python의 GIL(Global Interpreter Lock): 한 번에 하나의 스레드만 (Python 바이트)코드를 실행하도록 보장하는 메커니즘 → “파이썬 프로그램은 특정 시점에 오직 하나의 스레드만 실행된다” → 멀티 스레드가 싱글 스레드처럼 기능함(성능병목 현상)
      • 하나의 스레드만 파이썬 인터프리터를 제어할 수 있도록 하는 뮤텍스
      • 멀티스레딩 환경에서의 동시성 문제(경쟁,데드락, 데이터 일관성)를 해결하는 간단한 방법
      • 특히, race condition(경쟁상태)에서 두 스레드가 동시에 값을 늘리거나 줄일 수 있음→ 메모리 누수 or 객체에 대한 참조가 남아있는데도 메모리를 잘못 해제할 수 있음
      • →GIL은 그래서 멀티 스레드 프로그램에서 이러한 레퍼런스 카운팅에 의해 발생할 수 있는 문제를 미리 예방하기 위해 도입(=메모리 안정성을 보장하기 위한 디자인적 선택)
        • 특히 I/O 바운드 작업에서는 GIL이 성능에 큰 영향을 미치지 않음
        • cpu바운드 작업에서는 영향이 있음(멀티스레드가 병렬처리안됨→성능저하)

 

 


데코레이터

 

: 함수를 입력으로 받아 기능을 추가한 뒤 이를 다시 함수의 형태로 반환하는 함수

 

 

<우리가 데코레이터를 쓰는 이유>

  • 함수의 내부를 수정하지 않고, 기존 코드에 기능을 추가할 수 있음
  • 함수의 전처리, 후처리에 대한 필요가 있을 때 사용 → 반복을 줄이면서 기능추가 가능
  • 데코레이터는 로깅, 인증, 캐싱과 같은 작업에 광범위하게 사용
  • @login_required, requrie_method

파이썬의 메모리 관리방식

파이썬은 기본적으로 자체적으로 메모리 관리를 수행함→ 개발자가 직접 메모리 할당과 해제에 신경쓰지 않아도 되게 설계된 언어이다.

  • 파이썬 인터프리터가 자동으로 메모리를 관리함
  • 파이썬은 객체의 참조 횟수를 추적(카운팅)해서, 객체의 참조 횟수가 0이 되면 가비지 컬렉터를 이용해서 (해당 객체의)메모리를 해제함
  • 또 파이썬은 객체들 간의 종속성을 추적하여, 객체 간의 순환 참조가 발생하는 경우에도 메모리 누수를 방지함 → 가비지 컬렉터가 해제/하지만_가비지 컬렉터로 해제할 수 있는 건 “일부_순환참조”일 뿐!!!!
  • —>약한 참조(import weakref모듈)/명시적인 참조 해제_가 필요할 수도 있다
    • 순환참조: 2개 이상의 객체가 서로를 참조하는 상황
    • 객체가 더 이상 사용되지 않아도, 참조 계수 카운팅이 0이 되지 않아서 메모리 누수 발생가능