Patrick's 데이터 세상

효율적인 Code Review - Pycon Korea 2022 본문

Programming/Python

효율적인 Code Review - Pycon Korea 2022

patrick610 2022. 10. 2. 18:13
반응형
SMALL

 

 

 

https://2022.pycon.kr/

 

파이콘 한국 2022

PYCON KOREA 2022: 10.01 - 10.02

2022.pycon.kr:443

 

 

Pycon Korea 2022가 22.10.01~02 2일 간 성황리에 개최되었습니다.

그중에서도 '파이썬 코드 리뷰 꿀팁'이라는 제목으로 위대한 상상 R&D 에서 파이썬 백엔드 개발을 하고 있는 김동현 님의 발표에서 배운 내용을 정리해보려고 합니다.

 

발표 제목 그대로 보통 현재 회사에서는 프로젝트 단위로 혼자 코드를 짜고 정리할 일이 많은 필자에게는 '꿀팁' 발표였습니다.

협업에 대한 대비책이기도 하고 혼자 코드를 관리할 때도 좀 더 효율적으로 관리하기 위한 목적입니다.

3가지 라이브러리를 토대로 리뷰어, 리뷰이가 효율적으로 여러 근거를 제시할 수 있도록 도와줍니다.

 

 

 

👉🏻 dis

파이썬 표준 라이브러리, CPython 바이트 코드를 역 어셈블하여 읽기 쉽게 분석을 지원하는 모듈.

 

 

 

a + b 합계를 내는 간단한 함수로 확인해보겠습니다.

 

def sum_func():
  a = 1
  b = 2
  c = a + b
  return c
sum_func.__code__.co_code

list(sum_func.__code__.co_code)

함수의 바이트 코드를 보려면 code 속성에 접근해서 co_code 속성을 읽어보는데 bytes 데이터라 읽기가 어렵습니다.

 

 

import dis
dis.dis(sum_func)

dis.opname[100]

dis.show_code(sum_func)

첫 번째 column은 2, 3은 code line.

두 번째 column은 오프셋(해당 명령어에서 시작 위치), 명령어 이름.

세 번째 column은 명령어에 전달되는 파라미터(숫자는 상수, 변수의 위치. dis.show_code로 위치 확인).

 

 

Code Review Using dis

import dis
d = {}
def example_sub1():
  d.update({"a":1})
  return d
def example_sub2():
  d["a"] = 1
  return d

example_sub1에서는 딕셔너리에 update 메서드를 활용하여 "a" key를 입력하고

example_sub2에서는 subsript로 "a" key를 입력합니다.

두 방식 중 어떤 것이 효율적인지 비교합니다.

dis.dis(example_sub1)

dis.dis(example_sub2)

update 메서드 방식은 LOAD_METHOD로 메서드를 가져와 BUILD_MAP으로 새로운 딕셔너리를 생성, CALL_METHOD로 메서드를 호출, 스택에서 제거하기 위해 POP_TOP을 수행하는 여러 동작을 거쳐 임시 딕셔너리 생성하여 메모리를 더 많이 쓰는 반면,

subscript 방식은 STORE_SUBSCR 하나의 동작만 수행합니다.

 

 

 

 

👉🏻 Timeit

파이썬 코드의 작은 조각의 시간을 측정하는 모듈

 

 

import timeit
def callable():
  return [True for _ in range(1000)]
timeit.timeit(callable, number=1000)

 

 

d = dict.fromkeys(range(10000))
%timeit 9999 in d.keys()

%timeit 9999 in d

0~9999 키가 있는 딕셔너리에서 9999 키가 있는지 check 할 때, d.keys() 메서드를 사용하면 딕셔너리가 이미 iterable 데이터라 keys()를 사용하면 속도가 2배 가까이 차이 납니다.

 

 

 

 

 

👉🏻 pre-commit

Git hook framework for multi-language

코드 리뷰 단계 전에 컨벤션 검사나 린트 등을 자동으로 수행해주는 도구.

 

 

Client-Side Hooks : 로컬에서 git 사용 시 발생하는 Hook

Server-Side Hooks : 원격 레포지토리 서버의 이벤트, 로컬에서 push 요청을 하면 server에서 발생하는 이벤트

 

git hook 스크립은. git/hooks/{이벤트명}으로 정의

 

프로젝트 루트 경로에 .pre-commit-config.yaml 안에 repo 옵션, rev 버전, hooks를 정의.

 

 

 

👉🏻 정리

dis, timeit을 통해 좀 더 효율적인 코드를 비교하면서 짤 수 있을 것 같고, pre-commit은 협업 업무 시 획일된 code style 등을 formatting 할 수 있을 것으로 기대됩니다.

 


👉🏻 참고 영상

https://www.youtube.com/watch?v=L6Lz793mzrU 

 

반응형
LIST

'Programming > Python' 카테고리의 다른 글

Python Clean Code 정리  (2) 2023.05.25
Glances 성능 모니터링  (0) 2021.04.09
Python 데이터 분석 - Google Maps Setting  (0) 2020.06.24
Python 데이터 분석 - Google API  (0) 2020.06.24
Python 데이터 분석 - WordCloud  (2) 2020.06.24
Comments