Day 4 summary

ChamChoi·2021년 12월 30일
0

8일차_파이썬 잘하는 척 해보자

  1. 퍼포먼스 vs. 생산성
    (1) 퍼포먼스

    • 코드를 실행했을 때 (기계가) 처리하는데 걸리는 시간. 짧을수록 좋음.
    • C>Java>Python
      (2) 생산성
    • (사람이) 코드를 작성하는데 걸리는 시간. 짧을수록 좋음.
    • Python>C. 사람이 작성하므로 물론 개별 차이는 존재함.
      (3) 파이썬이 왜 좋은가?
    • 높은 생산성
    • 간결한 코드
    • 빠른 개발속도
    • 스크립트 언어
  2. 컴파일 언어 vs. 스크립트(인터프리터) 언어
    (1) 컴파일 언어

    • 입력한 언어를 기계가 인지할 수 있는 기계어로 변환하여 주는 것.
    • 실행 전 코드를 (한 번에 모두) 컴파일하여 기계어로 변환 후 실행.
    • 이미 기계어로 변환된 것을 실행하므로 실행속도가 비교적 빠름.
    • 컴파일 시점에 소스 코드의 오류를 잡기 쉬움
    • 같은 코드도 다른 환경에서 실행하려면 다시 컴파일 해야 함.
      (2) 스크립트(인터프리터) 언어
    • 코드를 작성함과 동시에 인터프리터가 기계어로 번역하고 실행함.
    • 코드 번역 과정이 있어 비교적 느림.
    • 주 사용 목적이 뚜렷하게 개발되어 사용하기 쉬운 편.
    • 명령줄로 코드를 즉시 실행할 수 있음.
  3. For문 팁
    (1) Enumerate

    • 리스트, 문자열, 튜플 등이 있는 경우 순서와 리스트의 값을 함께 반환.
      (2) 이중 for문
    • for 구문 안에 for 구문을 넣는 것.
    • 다중 for문도 가능하나 처리시간이 많이 증가하여 권장하지 않음.
      (3) List comprehension
    • 리스트 등의 순회형 컨테이너 객체로부터 이를 가공한 새로운 리스트를 생성함.
    • 대상 객체 내에 문장을 삽입.
      (4) Generator
    • 현재 처리해야 할 데이터를 1개씩 로드해서 사용.
    • 반복문 사용시, 메모리를 필요객체의 최소수량만 사용하게 되어 객체의 총 갯수만큼 확보할 필요없음.
  4. Try - Except

    • 에러 발생시 무시하게 하거나 적절한 처리를 해주는 작업.
    • 특정 오류메시지를 설정할 수 있어 어느 부분에서 문제가 발생하는지 확인하기 쉬워진다.
    • Except와 비슷하게 Pass가 있음. 문법적으로 해당 문장이 필요하지만 프로그램이 특별히 할 일이 없을 때 사용.
  5. Multiprocessing

    • 여러 개의 작업을 병렬처리함.
    • import multiprocessing으로 시작.
      (1) pool = multiprocessing.Pool(processes = 4)
    • 병렬 처리시, 4개의 프로세스를 가동함.
    • 현재 환경의 CPU 코어 개수만큼 입력해주면 최대의 효과를 봄.
      (2) pool.map(count, num_list)
    • 병렬화를 시키는 함수.
    • count 함수에 num_list의 원소들을 하나씩 집어넣음.
    • 예) count('p1'), count('p2'), count('p3'), count('p4')
      (3) pool.close()
    • 일반적으로 병렬화 부분이 끝날 때 나옴.
    • 더 이상 pool을 통해서 새로운 작업을 추가하지 않을 때 사용함.
      (4) pool.join()
    • 프로세스가 종료될 때까지 대기하도록 지시함.
  6. 함수

    • 코드의 효율성 향상
    • 코드의 재사용성 향상
    • 코드의 가독성 향상
    • 함수 안의 함수는 해당 함수 내부에서만 사용 가능.
    • 여러 개의 변수를 반환할 경우는 콤마를 사용.
  7. 람다 표현식(Lambda expression)

    • 더 상세히 공부해야 함.
    • 더 많은 예시가 필요.
  8. 클래스, 모듈, 패키지

    • 클래스: 비슷한 역할을 하는 함수들의 집합
    • 모듈: 함수, 변수, 클래스를 모아놓은 파일. 코드의 저장소. 별도의 파일로 저장하고 import로 불러옴.
    • 패키지: 라이브러리. 여러 모듈을 하나로 모아둔 폴더 pip 등으로 설치.
  9. 프로그래밍 패러다임
    (1) 절차 지향 프로그래밍
    - 일이 진행되는 순서대로 프로그래밍하는 방법.
    - 장점: 코드가 순차적으로 작성되어 있어 순서대로 읽기만 하면 이해가 가능함.
    - 단점: 순차적으로 작성되어 있기 때문에 위에서 하나가 잘못되면 아래도 연쇄적으로 문제가 생겨서 유지 보수가 어렵다. 코드 길이가 길어서 코드 분석이 어렵다.
    (2) 객체 지향 프로그래밍

    • 개발자가 프로그램을 상호작용하는 객체들의 집합으로 볼 수 있게 함.
    • 객체를 먼저 작성하고 함수를 작성함. 작성된 객체는 객체 간 상호작용이 있음.
    • 장점: 코드를 재사용하기 쉬움. 코드 분석 쉬움. 아키텍처 변경 쉬움.
    • 단점: 설계 소요 시간이 길다. 설계를 잘못하면 전체를 바꿔야 할 수도 있다.
  10. 함수형 프로그래밍

    • 데이터 사이언티스트에게 적합한 프로그래밍 방법.
    • 효율성, 버그 없는 코드, 병렬 프로그래밍 등의 장점 있음.
    • 문제를 함수로 분해함.
    • 함수의 출력값은 함수 외부의 다른 변수나 함수에 의해 변하지 않음.
      (1) 순수성
    • 부작용: 내부 상태를 수정하거나 함수의 반환값에서 보이지 않는 다른 변경사항들을 만드는 것.
    • 순수 함수: 부작용이 없는 함수
    • 부작용을 피한다는 것: 프로그램이 실행될 때 해당 프로그램이 수정될 수 있는 상황을 엄격히 제한한다는 것.
    • 모든 함수의 출력은 입력에만 의존해야 한다.
      (2) 모듈성
    • 복잡한 한 작업보다 단순한 여러 작업이 코딩하기에 더 쉬움.
      (3) 디버깅과 테스트 용이성
    • 각각의 함수가 작고 명확하게 명시되기 때문에 디버깅을 하기 쉬움
    • 각 함수의 입/출력을 확인하면서 예상과 다른 것이 나오면 해당 부분이 문제임.

동적 계획법

피보나치 수를 구하는 함수에 DP 적용하기
1) 문제를 부분 문제로 분할
2) 가장 작은 부분문제부터 해를 구함
3) 결과를 테이블에 저장하고, 다음 상위를 구함.

DP 구현방식
1) recursive

  • 재귀적 구조는 overhead가 발생할 수 있음
    2) iterative
  • 반복적 구조로서, 성능면에서 보다 효율적
  1. DFS
    • 비선형 구조인 그래프 구조는 그래프로 표현된 모든 자료를 빠짐없이 검색하는 것이 중요.
    • Depth first search(DFS)와, Breadth first search(BFS)가 있음.
      (1) DFS
      1) 시작 정점의 한 방향으로 갈 수 있는 경로가 있는 곳까지 깊이 탐색
      2) 더 이상 갈 곳이 없게 되면, 가장 마지막에 만났던 갈림길로 돌아옴.
      3) 다른 방향의 정점으로 탐색을 반복하여 모든 정점을 방문.
    • 가장 마지막에 만났던 갈림길의 정점으로 되돌아가서 다시 DFS를 반복해야 하므로 후입선출 구조의 스택을 사용.
      1) 시작 정점 v를 결정하여 방문
      • 정점 v에 인접한 정점 중에서
        a. 방문하지 않은 정점 w가 있으면, 정점 v를 스택에 push하고 정점 w를 방문. w를 v로 하여 반복함.
        b. 방문하지 않은 정점이 없으면, 탐색의 방향을 바꾸기 위해서 스택을 pop하여 받은 가장 마지막 방문 정점을 v로 하여 반복.
profile
microCT_applications

0개의 댓글