2020년

Python 공부

위지원 2020. 12. 14. 22:38

아래 깃허브를 보고 공부한 내용.

 

JaeYeopHan/Interview_Question_for_Beginner

:boy: :girl: Technical-Interview guidelines written for those who started studying programming. I wish you all the best. :space_invader: - JaeYeopHan/Interview_Question_for_Beginner

github.com

 

GIL(Global Interpreter Lock)

    - 스레드에 사용되는 Lock을 인터프리터 레벨로 확장한 개념

    - 여러 스레드의 동시 실행 방지

    - 멀티 스레드로 만들었어도 본질적으로 싱글 스레드로 동작

 

GIL의 장점

    - 활용하지 않은 경우 대비 구현이 쉬움

    - 레퍼런스 카운팅 메모리 관리방식에서 오버헤드가 적어 싱글 스레드일 때 fine grained lock방식보다 성능이 우월

    - C extension을 활용할 때 GIL은 해제되어 C기반 CPU bound program 기반 멀티 스레드는 실행이 빠름

 

GC 작동 방식: 가비지 컬렉션, 레퍼런스 카운팅을 이용하여 메모리 관리

    - 기본적으론 레퍼런스 카운트가 0이면 해제하지만, 이에 도달할 수 없는 reference cycles의 발생 시 GC가 해결

        - 순환 참조: 본인 참조, 서로 참조 등(del로 해당 객체를 삭제해버리면 레퍼런스 카운팅 방식으로는 메모리에서 해제 불가)

    - GC는 내부적으로 generation(세대)와 threshold가 존재해 세대별로 구분하며 0 세대에 가까울 수록 더 자주 가비지 컬렉션 (default generation = 3)

if 메모리 할당:
    generation[0].count+=1
if 메모리 해제:
    generation[0].count-=1
if generation[0].count > threshold[0]:
    generation[0].count = 0
    generation[1].count +=1

 

     - 파이썬은 gc 모듈이 있음: 직접제어 가능

        - 오.로.지. 순환참조를 탐지하고 해결하기 위해 존재 

    - 라이프 싸이클: 가장 오래된 세대부터 역으로 확인해 threashold보다 큰 할당 횟수인경우 collect()를 호출해 GC 수행

        - collect: 순환 참조 탐지 알고리즘 수행: 특정 세대 도달 가능 객체, 도달 불가능 객체를 구분한 뒤 도달 불가능 객체 집합을 찾음

            - 도달 가능 객체: 상위 세대(0->1)로 merg

            - 도달 불가능 객체: callback 수행 후 메모리에서 해제

 

    - 컨테이너 객체: __contatin__ 메서드가 구현되어있는 객체로 객체를 만드는데 컨테이너는 직접 관여하지 않음 (eg. 문자열, 튜플, 리스트, 딕셔너리, 집합 등)

     * 컨테이너(Container) 자료형(Data type)의 저장 모델로 종류에 무관하게 데이터를 저장할 수 있음을 뜻합니다.

 

Python 강좌 : 제 43강 - 컨테이너 메서드 | 076923

컨테이너 메서드(Container Method)

076923.github.io

     - 순환 참조는 컨테이너 객체에서만 발생 : 순함참조 감지를 위해 더블 링크드 리스트 사용해 모든 컨테이너 객체 추적

 

Celery: 메시지 패싱의 분산 비동기 작업 큐

    - Broker는 Message로 Task를 Worker에게 전달하여 Task를 처리

    - 멀티프로세싱, eventlet, gevent 사용

        - eventlet: 비동기 통신 지원 라이브러리

        - gevent: a coroutine -based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libev or libuv event loop. 

    - 하나 혹은 그 이상 Worker에서 동시 실행 

    - 백그라운드에서 비동기 실행 가능

 

PyPy.speed > CPython.speed: CPython은 인터프리터, PyPy는 실행추적 JIT(Just In Time) 컴파일 제공 인터프리터

    - Python 인터프리터를 다시 파이썬으로 구현

    - 실행추적 JIT 컴파일: 메서드 단이로 최적화 하는 전통적 JIT와는 다르게 런타임에서 자주 실행되는 루프 최적화

    - RPython: 실행추적 JIT 컴파일을 C로 구현해 툴체인을 포함하는 일종의 인터프리터 제작 프레임워크(언어)

         - 툴채인:주로 다른 컴퓨터 또는 시스템의 소프트웨어 제품을 만드는 데 사용되는 컴퓨터 프로그램 개발 도구들의 집합

         - 동적 언어인 Python에서 표준 라이브러리와 문법에 제약을 가해 변수의 정적 컴파일이 가능

         - 동적 언어 인터프리터 구현

 

메모리 누수가 발생하는 경우(사용자 부주의)

    1. mutable 객체를 기본 인자값으로 사용

    2. Tiemout이 없는 캐시 데이터 사용

    3. __del__ 메서드 재정의: 순환 참조 중인 클래스가 __del__ 메서드를 재정의하고 있다면 GC로 해제 불가능

 

Duck Typing: 객체의 변수와 메서드가 그 객체의 적합성을 결정하는 것을 의미함(특히 동적 타입 프로그래밍 언어에서 많이 사용)

    - 필요한 메서드가 모두 구현되어 있어야 함, 그렇지 않은 duck typing이 실패된 것

 

Dcuk Test: 만일 그 새가 오리처럼 걷고, 오리처럼 꽥꽥거린다면 그 새는 오리일 것이다.

 

Timsort: Python의 sortsms timsort로 구현되어있어(2,3버전부터) merge sort와 insert sortrk 병합된 안정정렬

    - 시간 복잡도가 O(n)~O(n log n)이 보장되며, 공간 복잡도 역시 O(n). 

    - 안정정렬: 동일 키 요소의 순서가 섞이지 않고 보장됨