Python 112

[Python 심화] Python의 GIL과 느린 이유

Python이 느린 이유 🎈 1. 파이썬은 C, Java와 달리 동적 타입 언어이다. 정적 타입 언어는 사전에 자료형을 명시하는 경우이고, 동적 타입 언어란 자료형을 명시하지 않는 경우의 언어이다. 아래 덧셈 연산으로 비교해보면 파이썬이 훨씬 더 절차가 복잡한 것을 알 수 있다. C언어 파이썬 int a=1; int b=2; int c = a+b; a=1 b=2 c=a+b 컴파일(자료형 판단 완료) => a에 1할당 => b에 2할당 => 덧셈 연산 호출 => 결과 c에 할당 a에 1할당 => a타입판단 => a 값 정수 1 설정 => b에 1할당 => b타입판단 => b 값 정수 2 설정 => 덧셈 연산 호출 => 객체 c 생성 => c자료형 정수 설정 => c 값 정수 3 설정 🎈 2. 파이썬은 인터..

Python/Advanced 2022.08.24

[Python Utils] Python Type 어노테이션/힌트 (Typing, mypy)

Python Type 어노테이션/힌트가 필요한 이유는? Python은 동적 타입 언어(Dynamic language)로 실행하는 시점에 변수의 타입(Type)을 고려하며 체크하기 때문에 타입 힌팅을 통해 좀 더 방어적인 코드를 작성 할 수 있다. mypy mypy는 정적 타입의 검사기로 실행시 함수에 정상적으로 Type이 맞게 들어오는지 검사 해주는 역할을 한다. # 라이브러리 설치 pip install mypy # 실행 명령어 mypy test.py # test.py def add(a: int, b: int) -> int: # int형 변수 a와 b를 입력받아서 int형 값을 반환 return a + b if __name__ == "__main__": add(1, 2) # 성공 add('h', 3) #..

Python/Utils 2022.08.24

[Python Utils] 코드 컨벤션 (pylint, flake8, pre-commit, mypy)

Pylint 파이썬 코드의 오류를 확인 및 코딩 표준 (PEP8) 을 검사 아래 처럼 Score와 문제가 있는 Line을 출력 해준다. # 라이브러리 설치 pip install pylint # pylint 실행 pylint pre-commit hook git 로컬에서 커밋시마다 주어진 조건에 따라 TEST 해주는 도구 black, isort, pylint, flake8 등... 다양한 code formatter와 style checker들을 차례대로 진행되게 할 수 있다. 설정은 pre-commit-config.yaml 파일로 관리 아래는 pre-commit으로 간단히 black이란 code formatter를 hook으로 거는 것 명령어 $ pip install pre-commit $ pre-commi..

Python/Utils 2022.08.24

[웹서버] WebServer와 WAS 차이

Web Server 란? WebServer는 HTTP, HTTPS를 통해 Web Browser와 직접 통신하며 정적 콘텐츠(html, css, js 등)를 클라이언트에 제공해주며 WAS의 부하를 줄이기 위해, 기본적인 도메인 라우팅 관리, 부하 로드밸런싱, ssl 등의 작업 수행 하여 was의 역할 분담 등의 목적으로 주로 사용 된다. 주로 많이 언급되는 WebServer로는 Apache Tomcat, Nginx, IIS(Window) 등이 있다. WAS (Web Application Server) WAS (Web Application Server)는 외부로부터 Traffic을 받아 중간 Interface(Gunicorn, uWSGI 등)에서 Web Application으로 Request를 전달하고, R..

Python/Deployment 2022.08.23

[Django] Request 구조 분석 (with. DRF, Query-String vs Path-variables)

DRF의 Requests 객체 https://www.django-rest-framework.org/api-guide/requests/ Requests - Django REST framework www.django-rest-framework.org 메소드 종류 설명 request.method HTTP Request 메소드 종류 GET, POST, PUT, PATCH, DELETE 등 request.content_type body에 들어갈 Media type request.data body에 들어가는 데이터 전체 request.FILES file 형식의 객체 request.FILES.getlist 여러 개의 file 형식 객체들 (list 형태) request.query_params URL Query Par..

Python/Django 2022.08.22

[Django] Query Profiling Tool (3) - Silk

Django Silk 란 Django Silk는 Request의 총 걸린 시간 / Query 시간 / Query 갯수 등을 Profiling 해주는 Tool 기본적으로 Request와 Response를 DB에 저장하기 때문에 자체가 서버에 부하를 줄 수 있음 Request 마다 걸린 시간 / Query 수 / Query 문 등을 분석 할 수 있으며, DB Clear도 웹으로 편하게 가능 Django Silk 설치 pip install django-silk https://pypi.org/project/django-silk/ django-silk Silky smooth profiling for the Django Framework pypi.org settings.py app, middleware, 옵션 추가..

Python/Django 2022.08.12

[Django] Query Profiling Tool (1) - Django debug toolbar

django-debug-toolbar 설치 pip install django-debug-toolbar settings.py INSTALLED_APPS = [ # ... 'django.contrib.staticfiles', 'debug_toolbar', ] MIDDLEWARE = [ # ... 'debug_toolbar.middleware.DebugToolbarMiddleware', # ... ] # DRF의 Response 로 return 하는 구조의 툴바 뜨게 DEBUG_TOOLBAR_CONFIG = { "SHOW_TOOLBAR_CALLBACK": lambda request: True, } STATIC_URL = '/static/' INTERNAL_IPS = [ '127.0.0.1', ] urls.py..

Python/Django 2022.08.12

[Django] Query Profiling Tool (2) - Custom Decorator & Logger

Query Debugger Custom Decorator 형식의 Query Debugger로 전체 API 동작간 호출 된 Query의 갯수, 전체 걸린 시간을 체크할 수 있다. (ex. Testcode에서 함수 위에 설정해서 실행해도 동작한다) from django.db import connection, reset_queries import time import functools def query_debugger(func): @functools.wraps(func) def inner_func(*args, **kwargs): reset_queries() start_queries = len(connection.queries) start = time.perf_counter() result = func(*arg..

Python/Django 2022.08.12

[Django] Queryset 최적화 기법 (select, prefetch, F, Indexing 등)

사전 학습 내용 https://yubi5050.tistory.com/60 // ORM 이란? https://yubi5050.tistory.com/83 // ORM Queryset API https://yubi5050.tistory.com/130 // ORM Queryset 특징 QuerySet 최적화 기법 (1) select_related & prefetch_related 일반적으로 조회(GET)시 or Serailization 과정에서 많이 발생 ORM의 Lazy Loading 특성에서 발생하는 N+1 Problem 등 의 문제를 극복하기 위해 Eager Loading (즉시 로딩) 진행 📁 select_related ForeignKey(1:M)의 1입장에서, OneToOne 관계 등에서 사용 가능 S..

Python/Django 2022.08.11

[Django] ORM Queryset 특징

사전 학습 내용 https://yubi5050.tistory.com/60 // ORM 이란? https://yubi5050.tistory.com/83 // ORM Queryset API QuerySet 특징 1 . LazyLoading (지연 로딩) 정말 필요한 시점에 데이터를 로드 진행 반복(Iteration), 슬라이싱 (Slicing) 피클링 / 캐싱 (Pickling/Caching) repr(), len(), list(), bool() 정말 필요한 만큼만 로드 진행함 위의 문제는 N+1 Problem 과 같은 문제 발생 QuerySet 특징 2. Caching 기존에 호출했던 Query 결과에 대해 cache를 가지고 있음 QuerySet의 캐싱을 통해 Query 문이 덜 호출되도록 하는 것이 중..

Python/Django 2022.08.08