본문 바로가기

Python/기타

파이썬 기초 정리(2)

안녕하세요. 이번에는 Python 기초  정리 2번째를 해보도록 하겠습니다. 

 

참고한 자료는 다음과 같습니다.

 

- 파이썬 자료구조와 알고리즘 (한빛미디어, 2019)

 

- 점프 투 파이썬

wikidocs.net/book/1

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

- 파이썬 코딩 도장

dojang.io/course/view.php?id=7

 

강좌: 파이썬 코딩 도장

모두 펼치기모두 접기

dojang.io

 

 

asfirstalways.tistory.com/335

 

[DP] 1. 싱글턴 패턴(Singleton pattern)

#1. 싱글턴 패턴(Singleton Pattern) 싱글턴 패턴이란 인스턴스를 하나만 만들어 사용하기 위한 패턴이다. 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등의 경우, 인스턴스를 여러 개 만들게 되면 자원

asfirstalways.tistory.com

juyoung-1008.tistory.com/47

 

프로세스와 쓰레드의 차이

Process와 Thread 프로세스(Process) 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체) 운영체제로부터 시스템 자원을 할당

juyoung-1008.tistory.com

coneseo.tistory.com/40

 

TechStudty -04 멀티 스레드의 특징

멀티 스레드란? * 아래는 멀티 스레드에 대해 알아보기 전에 알아야할 기초적인 것들의 정의들 프로그램 : 어떤 작업을 하기 위해 실행할 수 있는 파일 프로세스 : 컴퓨터에서 연속적으로 실행되

coneseo.tistory.com

1. class

○ class란 사전에 정의된 특별한 데이터와 메서드의 집합을 말함

 

○ 객체(Object) : 클래스를 선언한 변수

ex)

a = school()라고 할 때 a는 객체가 됨

 

○ 인스턴스(Instance) : 위의 예시에서 a 객체는 school이라는 class의 인스턴스임

  => 객체와 인스턴스의 차이 : 설명할 때 어디에 중점을 두느냐에 따라 명칭이 달라짐

 

○ 생성자 : 객체가 생성될 때 자동으로 호출되는 메서드

  ● a = school() 할 때 생성자가 호출됨

  __new__라는 특수 메서드 호출되어 객체 할당된 후, __init__(메서드가 객체를 초기화 함)

 

○ 속성 

  ● self.xxx에 해당하는 모든 변수

 

 특수화

  ● 슈퍼(부모) 클래스의 모든 속성을 상속하여 새 클래스를 만드는 절차

  ● 서브(자식) 클래스에서 상속 받은 메서드에 대해 모두 재정의 가능

  ● 상속 받지 않는 클래스는 object를 명시하는 것이 좋음

  ex)

    class Sample(object):

      pass

 

 다형성

  ● 메서드가 서브 클래스 내에서 재정의 될 수 있다는 의미(Overriding)

  ● 슈퍼 클래스의 메서드 호출시, 내장된 super() 메서드 사용하여 호출 가능

 

○ 객체가 해시 가능 : hash() 속성을 호출할 수 있으며 불변 객체임을 의미함

 

합성, 집합화 : 한 클래스에서 다른 클래스의 인스턴스 변수를 포함하는 것. 클래스 간의 관계를 나타냄

  ● 합성 : 의존성이 강함 

  ex) '아파트 단지'라는 class 안에 '101동', '102동' 등의 class가 있음
  ● 집합화 : 독립성 강함

  ex) '대학생'이라는 class 안에 '경영학과', '미술학과' 등의 주전공 class가 있을 때 1번 '대학생' class에는 '경영학과', 2번 '대학생' class에는 '미술학과'가 들어가 있는 등.

    => '경영학과', '미술학과'를 동시에 포함하지 않음

2. 디자인 패턴 : 잘 설계된 구죠의 형식적 정의를 소프트웨어 엔지니어링으로 옮긴 것

○ 데커레이터 패턴

  ● @ 표기를 사용해 함수 또는 메서드의 변환을 지정함

  ● 함수의 객체, 함수를 변경하는 다른 객체의 wrapping을 허용함

    □ wrapping : 호출할 함수를 함수로 감싸는 형태

    ex)

    def printing(function):                      

        def wrapping():  

            print(function.__name__, 'start function')   

            function()

            print(function.__name__, 'end function')    

        return wrapper      

 

    @printing

    def hi():    

        print('hi')  

   

    @printing 

    def goodbye():

        print('goodbye')  

 

    hi()

    goodbye()

 

  ● @classmethod : 메서드를 클래스로 변환시킴. 클래스 내 변수에 접근시 classmethod의 첫 번째 인수 사용 가능

  ● @staticmethod : 메서드를 정적 메서드로 변환시킴

 

○ 옵저버 패턴

  객체의 일대다 의존 관계에서 한 객체 상태가 변경되면, 그 객체에 종속된 모든 객체에 대해 자동으로 상태 갱신하는 방식

  ● @property로 구현

 

○ 싱글턴 패턴

  ● 초기화된 객체의 인스턴스를 전역에서 사용하려는 목적에서 사용

  ● 즉, 해당 인스턴스는 1개만 존재해야 함

  ex) x = school(), y= school()이라면 x == y는 True로 나와야 함

  ● python 은 private 접근 제한이 없으므로 __new__() 클래스 메서드로 하나의 인스턴스만 생성되도록 구현해야 함

   커넥션 풀, 스레드 풀 등의 객체인 경우 인스턴스를 여러 개 만들면 자원을 낭비하게 되므로 이를 방지하기 위해 싱글턴 패턴 활용

3. 멀티 프로세스

○ 프로세스 : 운영체제에서 실행되는 각 프로그램

  ● 독립적인 스택, 힙, 코드, 데이터 영역을 가짐

 

○ 스레드 : 프로세스 내에서 실행되는 흐름 단위. 프로세스가 할당 받은 자원을 이용하는 실행의 단위

   한 프로세스에 여러 스레드가 있으면 여러 작업을 동시에 수행하는 것 처럼 보이게 됨

  ● 한 프로세스에 속한 스레드는 스택 영역을 제외한 메모리 영역을 공유함

 

○ 멀티 프로세스

   여러개의 cpu를 사용해서 여러 프로세스를 동시에 수행하는 것

  ● 별도의 메모리 영역 가지며, 특정한 메커니즘으로만 프로세스 간 통신 가능.

  ● 각 스레드에 대해 별도의레지스터 집합을 불러오거나 저장함

  ● python : subprocess 모듈 사용

 

○ 멀티 스레드

  ● 한 프로세스를 여러 스레드로 나눠서 처리하는 방법

    => 보다 빠르게 작업 처리 가능할 수도 있음

   단일프로세스 내의 멀티 스레드 : 동일한 메모리에 접근함

  ● 스레드는 데이터 공유 통해 통신 가능

  ● python : threading 모듈 처리 통해 한번에 한 스레드만 메모리 영역에 접근 할 수 있음

  ● 한 스레드는 인터프리터 락을 획득해야만 실행이 가능함.

    => python에선 이러한 인터프리터 락이 1개만 있으며 이를 GIL이라 함. 즉, GIL이 없는 나머지 스레드는 해당 자원에 접근하지 못하여 대기 상태에 놓이게 됨.

  ● 문제점 : 서로 다른 스레드 간 데이터, 힙 영역 등을 공유하기 때문에 수정된 자료 구조 등을 공유하여 잘못된 결과값을 만들 수도 있음

    => 코딩에 주의

 

 

동시성 : 논리적으로 여러 작업이 동시에 실행되는 것처럼 보이게 함.

  ex) I/O 연산 동안 다른 작업 수행

 

병렬성 : 물리적으로 여러 작업이 동시에 처리되는 것

  ● 데이터 병렬성 : 같은 작업을 병렬처리 하는 것으로 하나의 큰 작업을 전체 데이터로 나눠서 병렬 처리

  작업 병렬성 : 서로 다른 작업을 병렬처리 함. 즉, 다수의 독립적인 요청을 병렬로 개별적으로 처리함

 

○ subprocess 모듈

  ● '부모-자식' 프로세스 쌍의 생성에 사용

    □ 부모 프로세스 : 차례로 다른 일을 처리하는 자식 프로세스 인스턴스 실행

    □ 자식 인스턴스를 사용하여, 멀티 코어 이점 활용 및 동시성 문제를 운영체제가 알아서 처리하도록 함

  ● 파라미터 튜닝 때 활용 가능

 

○ threading 모듈

  ● 멀티 스레드 사용시 이용하는 모듈

  ● 스레드가 여러 개로 분리시, 스레드 간 데이터 공유의 복잡성 증가 주의

  락, 데드락 회피에 주의해야 함

    □ 락 : 여러 스레드를 실행하는 환경에서 자원에 대한 접근에 제한을 강제하기 위한 동기화 메커니즘. 즉, 한 스레드가 쓰는 동안 다른 스레드가 못 쓰게 하는 것

    □ 데드락 : 둘 이상의 스레드가 락을 획득하기 위해 계속 기다리는 것

  ● 순서가 보장되지 않는 점에 주의

   내부적으로 락을 관리시 queue 모듈 사용

    => 한 번에 하나의 스레드만 데이터에 접근 할 수 있도록 만듦

   뮤텍스, 세마포어 등으로 스레드 통제 가능

4. 기타

○ 프로그램 성능 향상 방법

  ● 읽기 전용 데이터 : 리스트 대신 튜플 사용

  ● 반복문 : 항목 많은 리스트, 튜플 대신 제너레이터를 사용하여 순회

  ● 문자열 연결 시, '+' 대시니 리스트에 문자열 추가 후 마지막에 리스트 항목을 모두 하나로 연결함

    => 리스트 써서 연결

 

여기까지가 python 기초에 대한 정리 2였습니다. 잘못된 부분이나 궁금하신 사항 있으시면 말씀해주세요!

'Python > 기타' 카테고리의 다른 글

파이썬 기초 정리(1)  (0) 2020.10.15