언어/파이썬 & 장고
-
[Python] 너비 우선 탐색 (Breadth-First Search, BFS)언어/파이썬 & 장고 2021. 5. 31. 16:43
BFS란? BFS는 너비 우선 탐색 (Breadth-First Search)로 그래프 탐색 알고리즘 중 하나입니다. 정점에서 같은 레벨에 있는 자식 또는 형제들을 탐색하면서 내려가는 알고리즘입니다. 자세한 내용은 https://brownbears.tistory.com/395 에서 설명이 되어 있습니다. 예제 아래와 같은 그래프가 있다고 가정합니다. 이 그래프를 BFS 알고리즘을 사용하여 모든 노드를 방문한다면 아래와 같은 구조로 탐색을 하게 됩니다. 이러한 그래프를 만들기 위해 아래와 같은 형태로 주어졌다고 가정합니다. graph = { 'A': ['B', 'F', 'I'], 'B': ['A', 'E', 'C'], 'C': ['B', 'E', 'D'], 'D': ['C', 'G', 'H'], 'E': [..
-
[Python] 최단 경로 알고리즘 - 다익스트라 알고리즘 (Dijkstra Algorithm)언어/파이썬 & 장고 2021. 5. 16. 18:49
최단 경로 알고리즘이란 주어진 노드와 간선(edge)들 중, 가장 짧은 경로를 찾는 알고리즘입니다. 즉, 서울에서 인천, 대전, 광주, 부산을 갈 수 있는 가장 짧은 경로를 찾는 것입니다. 최단 경로 문제는 아래와 같이 3가지로 주어질 수 있습니다. 특정 노드에서 시작해 특정 노드까지 도착하는 가장 짧은 경로 특정 노드에서 시작해 모든 노드까지 도착할 수 있는 가장 짧은 경로 위 예시처럼 서울에서 시작해 서울-인천, 서울-대전, 서울-광주, 서울-부산 간 가장 짧은 거리를 찾는 문제 여기서 이동 경로가 양수라 하면 Dikjstra 알고리즘이고 음수를 포함한다면 Bellman-ford 알고리즘 모든 노드에서 도착할 수 있는 가장 짧은 경로 (floyd 알고리즘) 여기서 다익스트라 알고리즘은 2번에 해당되는..
-
[Django] select_for_update를 사용해 안전하게 데이터 수정하기언어/파이썬 & 장고 2021. 5. 16. 16:20
아래에서 설명할 때 사용한 장고는 1.11 버전입니다. 테이블이 아래와 같이 있다고 가정합니다. 아직 사용하지 않은 토큰을 유저가 사용했을 때, 해당 row에 유저의 id를 입력하도록 만든 테이블입니다. 이를 위해 아래와 같이 프로그래밍을 했다고 가정합니다. from datetime import datetime class UserToken(models.Model): id = models.BigAutoField(primary_key=True, db_column='id') token = models.UUIDField() user_id = models.BigIntegerField() updated_at = models.DateTimeField(auto_now=True) class Meta: managed = ..
-
[Python] Heap과 heapq 모듈언어/파이썬 & 장고 2021. 5. 2. 18:59
heap 에 대한 설명은 https://brownbears.tistory.com/391에서 했지만 여기서는 더 자세하게 설명을 합니다. Heap은 최댓값, 최솟값을 찾아내는 연산을 빠르게 하기 위해 고안되었으며 완전 이진 트리 (Complete Binary Tree)를 기본으로 가집니다. 즉, 데이터가 입력이 되면 가장 말단에서 왼쪽부터 차례대로 채워져 나갑니다. 최대 힙(max heap)은 부모의 노드가 자식 노드의 값과 같거나 더 크며 최소 힙(min heap)은 부모의 노드가 자식 노드의 값과 같거나 더 작습니다. 힙과 이진 탐색 트리 (binary search tree)이 쉽게 헷갈리는데 이진 탐색 트리의 경우, 부모 노드의 값보다 작으면 왼쪽, 크면 오른쪽 이라는 규칙이 있지만 힙의 경우엔 없습..
-
[Python] 양, 음의 무한대 표시언어/파이썬 & 장고 2021. 5. 2. 16:09
파이썬에서 양의 무한대, 음의 무한대를 표시는 다음과 같습니다. int타입의 양, 음의 무한대 파이썬 3에서는 아래와 같이 int 형의 무한대를 표시할 수 있습니다. import sys max_int = sys.maxsize min_int = -(sys.maxsize + 1) # 9223372036854775807 # 9223372036854775808범위를 정확하게 할 필요가 없다면 음의 무한대에 1을 추가할 필요가 없습니다. float타입의 양, 음의 무한대 float 타입의 무한대를 표시하는 방법은 두 가지가 존재합니다. math 모듈 사용 import math max_float = math.inf min_float = -math.inf # inf # -inffloat 내장함수 사용 max_floa..
-
[Django] prefetch_related 동작과 자동 쿼리 생성 조건 알아보기언어/파이썬 & 장고 2021. 5. 1. 20:44
먼저 아래에서 사용하는 장고의 버전은 Django 1.11.5 으로 현재 최신 버전인 3.2와는 동작이 다를 수 있습니다. 기본 조건 예시 모델 class Coupon(models.Model): coupon_no = models.BigAutoField( db_column='coupon_no', primary_key=True ) coupon_name = models.CharField( db_column='coupon_name', max_length=200 ) is_deleted = models.CharField( db_column='is_deleted', max_length=1, ) ... class CouponApplyBrand(models.Model): cou..
-
[Python] divmod를 사용해 몫과 나머지 구하기언어/파이썬 & 장고 2021. 3. 1. 20:45
divmod 모듈을 모른다면 몫과 나머지를 구하는 로직은 아래와 같습니다. # 몫 s = a // b # 나머지 r = a % b위와 같이 구하는 것도 좋지만 divmod를 사용하여 계산할 수도 있습니다. s, r = divmod(a, b) s, r = divmod(11, 3) # 3, 2divmod가 편해보여서 평상시에 사용해도 크게 상관은 없지만 처리 속도가 아주 중요한 프로그램에서는 사용에 지양해야 합니다. 계산하고자 하는 숫자가 작을 경우, divmod 보다 직접 연산자를 사용해서 계산하는 방식이 더 빠릅니다. 반대로 숫자가 크다면 divmod를 사용하는 것이 더 빠르게 처리됩니다. import timeit timeit.timeit('divmod(n, d)', 'n, d = ..
-
[Python] asyncio 파헤치기언어/파이썬 & 장고 2021. 3. 1. 20:12
asyncio는 파이썬 버전 별로 사용하는 형태가 조금씩 다릅니다. 아래 설명에서는 파이썬 3.8 기준으로 작성했습니다. asyncio란? 파이썬 3.5부터 지원하는 asyncio는 비동기 프로그래밍을 위한 모듈입니다. 동기란 빨래를 시작하고 종료가 되면 설거지를 시작하고 완료가 되면 TV를 보는 것처럼 한 번에 하나의 작업을 하는 것이고, 비동기는 빨래를 시작시키고 설거지를 하면서 TV를 보는 것과 같이 여러 작업을 동시에 하는 것과 같은 행동을 하는 것입니다. 하지만 파이썬에서는 GIL때문에 비동기 프로그래밍이 동기 프로그래밍보다 느릴 수도 있습니다. asyncio는 이벤트 루프와 코루틴을 기반으로 동작하며 데이터를 요청하고 응답을 기다리는 I/O bound한 작업에서 효율적입니다. 코루틴 기반이므로..
-
[Python] dataclasses 모듈 사용하기언어/파이썬 & 장고 2021. 2. 13. 20:15
들어가기 전에 파이썬 3.6부터 컴파일 언어와 같이 정적 타입을 미리 선언하여 사용할 수 있습니다. from typing import Dict def test(number: int, name: str) -> Dict[str, int]: return {name: number} test(1234, 'Kim') # {'Kim': 1234} test(1234, 1224) # 에러가 나진 않음 # {1224: 1234} 이는 개발을 할 때, hint를 줄 뿐이지 구문 오류와 같은 에러는 발생시키지 않습니다. 아래에서 설명할 때, 위 개념을 사용하여 설명합니다. 개요 파이썬 3.7부터 dataclasses 모듈이 도입되어 인스턴스 생성 시, 변수 할당부터 코드의 양을 줄일 수 있는 많은 기능이 생겼습니다. AS-I..
-
[Python] Enum 타입언어/파이썬 & 장고 2021. 2. 11. 17:03
파이썬 3.4부터 enum 타입을 지원하고 있습니다. 보통 enum은 연관 있는 여러 개의 상수를 선언할 때 사용하게 됩니다. enum 클래스를 사용하면 인스턴스의 종류를 제한할 수 있어서 프로그래밍에 있어 도움이 됩니다. 클래스 타입 enum 타입의 상수는 기본적으로 name과 value를 가지고 있습니다. from enum import Enum class Status(Enum): SUCCESS = 1 FAILURE = 2 RETRY = 3 Status.SUCCESS Status.SUCCESS.name Status.SUCCESS.value # Status.SUCCESS # SUCCESS # 1 이터레이션을 지원하므로 반복문을 통해 접근할 수 있고 value나 name으로도 직접 접근이 가능합니다. fo..