1. 중복된 코드(duplicate code)

한곳을 바꾸면 중복된 곳도 똑같이 바꿔줘야하는 불편함이 가장 큼

-> 함수나 루프문을 활용해서 개선하기

2. 매직넘버 대체

3. 주석처리된 코드와 죽은 코드

4. 리스트컴프리핸션 활용하기

5. excep를 사용해서 에러를 넘기는 코드,불충분한 설명이 들어있는 코드

 

코드악취에 대한 잘못된 통념

1.  함수나 메소드에 return문은 하나만? No, 여러개여도 된다.

2. 함수에 try문이 둘 이상 있으면 안된다? No, 함수는 하나의 일만 하도록 만드는게 통상적이나, 번거롭게 둘로 나눠야하는 기능이 있는 경우 나누지 않아도 되고 try문으로 해결한다.

3. 플래그 인수는 나쁘다? No, 함수를 번거롭게 나누는것보다 낫다

4. 전역변수는 나쁘다? No

표기법 3가지: snake_case, camelCase, PascalCase

UPPER_SNAKE_CASE: 상수인 경우

 

PEP8 명명규약

  • 모듈은 소문자
  • 클래스는 파스칼케이스
  • 상수는 UPPER_SNAKE_CASE
  • 함수,메소드,변수명은 lower_snake_case
  • 클래스 메소드의 시작은 cls, 메소드의 시작은 self
  • 클래스의 프라이빗속성은 _, 퍼블릭 속성은 _ 없이

 

코드 포매팅: 소스코드에 일련의 규칙을 적용해 특정한 형식을 갖추게 하는 것

PEP8(Python Enhancement Proposal8): 파이썬 코어 개발팀이 제안한 작성방법

Black(코드 포매터)

 

가로 간격(horizontal Spacing)

  • 들여쓰기(Indentation): tab이 나타내는 공백 폭이 가변적이라 탭보다는 공백을 선호, 동시에 사용해서도 안됨. 일반적으로 4칸을 선호함.
  • 연산자와 식별자 사이의 공백 한칸
  • 구분자 뒤쪽에 공백 한칸
  • 마침표 앞뒤로는 공백 넣지 않기
  • 함수, 매소드, 컨테이너 이름 뒤에는 공백을 넣지 않기
  • 열고 닫는 괄호 앞뒤로 공백넣지 않기
  • 코드행 끝에 2칸의 공백으로 주석달기

 

세로 간격(Vertical Spacing)

  • 함수나 클래스는 2줄의 빈행, 클래스 내의 함수들은 한줄의 빈행을 넣어야 함

 

Black 사용하기

블랙 설치하기: python3 -m pip install --user black

명령행에서 블랙 실행하기: python -m black script.py

하위 파일을 모두 블랙으로 포매팅하기: python -m black 경로

표준 행 길이 설정: python -m blakck -l 120 script.py

따옴표를 변경하지 않도록 설정: python -m black -l 120 -S script.py

블랙으로 수정될 내용 미리보기: python - m black --diff script.py

 

명령행 간략 사용법

명령어 이력: history

글로브패턴: 와일드카드인 *, ?를 사용하여 표현하는 식

파일 보기: dir(윈도우), ls(맥OS, 리눅스)

폴더명에 공백이 있는 경우: 큰따옴표로 폴더명을 묶어서 명령인수를 만듦

마침표로 시작하는 파일: 설정파일 (숨겨짐)

ls에 해당하는 옵션: -l(긴 형식의 파일보기) , -a(숨김파일 포함해서 모두보기)

현재 경로 밑에 원하는 파일 검색: find . -name *.py 

파일 복사: cp [복사하려는 파일] [복사할 폴더]

파일 이동: mv [복사하려는 파일] [복사할 폴더]

파일명 변경: mv [변경하려는 파일] [변경명]

파일 삭제: rm -r (강제로)

폴더 생성: mkdir [폴더명]

프로그램의 위치 찾기: which [프로그램명]

모든 명령행을 지우고 싶을때: clear

환경변수 보기: env

환경변수에 설정된 값 보기: echo [환경변수]

 

 

환경변수: 각 프로세스에 영향을 주는 사용자 설정값들의 모임

프로세스를 띄울때, 환경변수가 copy되어 해당 프로세스에만 적용됨.

운영체제의 환경변수집합을 새로운 프로세스가 생성될때 복사되며 이를 master copy라고 함

프로세스를 시작하면 현재 디렉토리에서 프로그램을 찾고, 이후 PATH 환경변수에 설정된 경로에서 찾음

경로를 ':'으로 여러개 설정할 수 있으며 이름이 중복된다면 가장위의 PATH 환경변수에서 프로그램을 실행함

환경변수를 영구적으로 수정하고 싶다면, .bashrc 파일에 'export 환경변수 = 내용'을 추가

 

 

 

 

 

 

  • multiprocess와 multithread의 개념, 차이, 장단점

https://velog.io/@xxhaileypark/%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9CMulti-Thread-%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4Multi-process

 

멀티 스레드(Multi Thread) & 멀티 프로세스(Multi process)

프로세스(Process)란? 프로그램 : 어떤 작업을 위해 실행할 수 있는 파일. 정적인 개념 프로세스 : 프로그램이 메모리에 올라와 cpu를 할당받고 프로그램이 실행되고 있는 상태. 동적인 개념 프로세

velog.io

 

  • python 기본 패키지 multiprocessing 사용법(multi-process)

https://velog.io/@finallazy/Python-multiprocessing-Pool

 

Python - Pool로 함수를 병렬 처리

multiprocessing 모듈을 이용하여 CPU 개수에 맞게 병렬처리를 해보자

velog.io

  • dask 사용법 

https://chealin93.tistory.com/288

 

Dask 패키지 사용 in Python

Dask는 병렬처리를 지원하는 Python Library 대규모 데이터의 분산처리 지원 Pandas와 Numpy형식을 그대로 계산지원 Delayed라는 함수 형식으로 함수를 병렬로 지원 최적화된 Dynamic task scheduling 지원 Dask Arr

chealin93.tistory.com

 

개인의견: multi-process를 쓰거나 multi-thread를 쓰는걸 선택하는 상황에서 각각 장단점이 있다. 

dask패키지 자체를 구현할때 python 기본패키지인 multiprocessing을 사용하기때문에 사용성을 높이고 속도가 좀 더 느릴 수 있다고 생각한다. 

프로세스끼리는 같은 객체를 사용할 수 없고, 프로세스 수만큼 데이터나 모델이 만들어지면서 메모리 사용이 배로 늘어나게 된다. 

shared memory를 사용하면 해결될 수 있지만 thread만큼 같은 객체를 공유하는데 빠르지 않다. 

객체를 프로세스 내에서 새로 복사하기 때문에 multi-processing이 multi-threading보다 오래걸림. 

그렇기에 한번만 선언한다면 processing이 빠름

'프로그래밍 > 병렬처리' 카테고리의 다른 글

Dask 패키지 사용 in Python  (1) 2023.11.20

Dask는 병렬처리를 지원하는 Python Library

  • 대규모 데이터의 분산처리 지원
  • Pandas와 Numpy형식을 그대로 계산지원
  • Delayed라는 함수 형식으로 함수를 병렬로 지원
  • 최적화된 Dynamic task scheduling 지원

 

Dask Array

import dask.array as da
f = h5py.File('myfile.hdf5')
x = da.from_array(f['/big-data'], chunks = (1000, 1000))

x - x.mean(axis=1).compute()

 

Dask DataFrame

import dask.dataframe as dd
df = dd.read_csv('file.csv')
df.groupby(df.user_id).value.mean().compute()

 

Dask Bag

import dask.bag as db
b = db.read_text('file.json.gz').map(json.loads)
b.pluck('name').frequencies().topk(10, lamba pair: pair[1]).compute()

 

Dask Delayed

 

from dask import delayed
L = []
for fn in filenames:
	data = delayed(load)(fn)
    L.append(delayed(process)(data))
    
result = delayed(summarize)(L)
result.compute()

'프로그래밍 > 병렬처리' 카테고리의 다른 글

multi-process vs multi-thread  (2) 2023.11.20

+ Recent posts