• Python 공부

    2020. 12. 14. 22:38

    by. 위지원

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

     

    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). 

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