파이썬이 느린 기술적 이유
파이썬이 다른 언어에 비해 느리다는 것은 사실이라고 생각한다.
비록 아주 짧은 시간의 차이이므로 우리가 체감하기는 어렵지만, 파이썬이라는 언어의 특성을 생각해보면 조금 느린 언어일 수밖에 없기 떄문이다
-
- 인터프리터 언어 + 동적 타입 언어+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이 되지 않아서 메모리 누수 발생가능
'TIL' 카테고리의 다른 글
[TIL 2024. 04. 30] DRF 개인과제 오류수정 (0) | 2024.05.01 |
---|---|
[TIL 2024. 04. 29] 모의면접 회고록 (0) | 2024.04.30 |
[TIL 2024. 04. 25] Python GIL | 메모리 관리 (0) | 2024.04.25 |
[TIL 2024. 04. 24] 컴파일러와 인터프리터 | 정적타입과 동적타입 (0) | 2024.04.24 |
[TIL 2024. 04. 23] REST | RESTful API | JSON과 Dict의 차이 (0) | 2024.04.24 |