본문 바로가기

전체 글71

Django ORM 구조와 최적화 전략 1. ORM ORM(Object Relational Mapping)은 객체와 관계형 데이터베이스를 연결(매핑)해주는 것을 말한다. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용 객체 모델과 관계형 모델 간에 불일치가 존재 ORM을 통해 SQL문을 자동으로 생성하여 불일치를 해결 장점 SQL 언어를 사용하지 않고도 데이터베이스를 조작 가능 DB를 바꾸더라도 ORM 코드는 그대로 이용이 가능하여 DBMS에 대한 종속성이 줄어든다. 유지보수의 편리성 단점 ORM만으로 복잡한 SQL문을 생성하는 데에 어려움이 있다. DB에 직접 쿼리를 보내는 것이 아니기 때문에 상대적으로 성능 저하가 발생 잘못된 사용은 N+1 Problem의 비효율을 야기 2. QuerySet Django OR.. 2022. 3. 17.
input() vs sys.stdin.readline() Python 3.x에서 input()은 결과적으로 입력 값을 문자열로 받게 된다. 그리고 Python 3.x로 넘어오면서 모든 변수가 객체(object)로 처리됨에 따라서 결과 값도 type에서 class로 바뀌게 되었다. sys.stdin.readline()의 stdin은 standard input을 의미하며, input()과 비슷한 동작을 수행한다. input()과 가장 큰 차이점은 input()은 내장 함수로 취급되는 반면, sys에 속하는 메소드들은 file object로 취급된다. 즉, 사용자의 입력만을 받는 buffer를 하나 만들어 그 buffer에서 읽어들이는 것이다. # Python 3.7 # input() intInput = input("Integer input : ") print(ty.. 2022. 3. 7.
[3단계] hash, 베스트앨범 1. 속한 노래가 많이 재생된 장르를 먼저 수록 {장르: 장르에 속한 노래들의 총 재생 횟수}를 만든다. 추후 value를 기준으로 장르를 정리할 것이다. 2. 장르 내에서 많이 재생된 노래를 먼저 수록 장르 내에 속하므로 전체는 장르로 구분하며, 노래는 고유 번호로 구분하고자 {장르: [고유번호, 재생 횟수]}로 생성한다. 장르와 노래는 1:N 관계이므로 리스트 형태로 값을 추가하겠다. sum_genres = collections.defaultdict(int) dic_total = collections.defaultdict(list) for genre, value in zip(genres, enumerate(plays)): sum_genres[genre] += value[1] dic_total[genr.. 2022. 3. 3.
[2단계] hash, 위장 Q. 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. 같은 이름을 가진 의상은 존재하지 않습니다. clothes의 모든 원소는 문자열로 이루어져 있습니다. 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다. 스파이는 하루에 최소 한 개의 의상은 입습니다. 문제 풀이 1) 해시 테이블로 변환 clothes = [[1, 모자], [2, 모자], [4, 하의], [5, 상의], [6, 상의]]가 주어졌다고 했을 때, 의상 종류 별로 이름을 구분하기 위해 hash table을 만든다. 종류에 해당하는 이름(valu.. 2022. 3. 2.
해시 알고리즘(hash algorithm) 해시 함수, 해시 알고리즘 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 여러가지 해시 알고리즘이 있는데 대표적으로 SHA 시리즈와 MD5가 있다. 해시 함수에 의해 얻어지는 값은 해시 값, 해시 코드, 해시 체크섬 또는 해시라고 한다. 해시의 용도 중 하나는 해시 테이블이라는 자료구조에 사용되며, 매우 빠른 데이터 검색을 위한 컴퓨터 소프트웨어에 널리 사용된다. 해시 테이블 해시함수를 사용하여 키를 해시 값으로 변환하고, 이 해시 값을 색인(index)으로 삼아 키와 데이터(value)를 저장하는 자료구조를 말한다. 기본연산으로는 탐색(Search), 삽입(Insert), 삭제(Delete)가 있다. 해시 충돌(Hash Collision) 해시 충돌이란 해시 함수가 서로 다른 두 개.. 2022. 3. 2.
Asyncio 실습 Asyncio의 이해 https://bentist.tistory.com/89 비동기 라이브러리 Asyncio 이해 concurrent.futures(다중 스레드, 비동기/Non-block 방식) Asyncio를 이해하기 전에 thread, process에서의 concurrent 프로그래밍 방식으로 python 3.2에 추가된 future(PEP 3148 – futures - execute computa.. bentist.tistory.com 실습할 환경이 주피터 노트북이라면 아래 코드를 추가해줘야 실습이 가능하다. 주피터 노트북은 자체적인 이벤트 루프를 사용하고 있어서, 우리가 생성한 이벤트 루프와의 중첩을 피해야 한다. !pip install nest_asyncio import nest_asyncio .. 2022. 2. 22.
함수 호출 스택(call stack), 프레임 파이썬 함수 호출 방식 파이썬의 함수는 스택(stack) 방식으로 호출된다. 즉, 함수를 호출하면 함수의 실행 컨텍스트가 호출된 순서대로 스택 메모리 공간에 차곡차곡 쌓여가고 함수가 끝나면 위쪽 방향으로 사라진다. 이와 같은 콜 스택 자료구조를 통해 현재 실행 중인 서브 루틴의 실행 컨텍스트를 담고 서브 루틴의 실행이 끝났을 때, 제어를 반환할 지점을 보관한다. 실행 컨텍스트 자바 스크립트에서 흔히 Execution context라고 하는 실행 컨텍스트는 파이썬에서는 runtime context라고 부르는데, 이 실행 컨텍스트는 코드를 실행하는데 필요한 환경을 담고 있는 객체이다. 더 쉽게 말하자면 코드 덩어리 같은 것이다. 코드 블록은 대부분의 경우 함수가 된다. 이 코드 블록 안에 변수 및 객체, 실.. 2022. 2. 18.
비동기 라이브러리 Asyncio 이해 concurrent.futures(다중 스레드, 비동기/Non-block 방식) Asyncio를 이해하기 전에, thread, process에서의 concurrent 프로그래밍 방식으로 python 3.2에 추가된 future(PEP 3148 – futures - execute computations asynchronously)를 먼저 이해할 필요가 있다. 이후 만들어진 asyncio도 이와 동일한 API로 만들어진 것이다. concurrent.futures 모듈에는 ThreadPoolExecutor와 ProcessPoolExecutor 클래스가 존재한다. concurrent.futures는 기본적으로 threading.Thread보다 고수준의 API를 구성한다. 기존의 스레드 모델은 일련의 코드를 다른.. 2022. 2. 16.
Iterator, Generator, Coroutine(코루틴)의 이해 파이썬에서 비동기 방식을 구현하기 위해서는 코루틴을 먼저 이해해야 한다. 그러나 코루틴의 저변에는 Iterator개념이 깔려 있기 때문에 Iterator와 Generator 객체를 함께 알아보고자 한다. 루틴(routine)과 서브루틴(subroutine) 함수가 정의되어 있다면 sub_rout()을 통해 함수를 호출할 수 있다. 이때 함수를 호출하는 쪽을 루틴이라고 부르고 호출된 함수(여기서는 sub_rout)를 서브 루틴이라고 부른다. 메인 루틴이 서브 루틴을 호출한 경우 서브 루틴이 결과를 반환할 때까지 루틴은 반환 값을 기다린다. 서브루틴이 종료되면 실행의 흐름(제어권)이 원래의 메인 루틴으로 돌아오며 이때 서브루틴이 리턴한 값을 루틴에서 사용하게 된다. 이렇게 순차적 처리 방식인 동기 방식으로 .. 2022. 2. 15.
동시성(Concurency)으로 프로그램 속도 개선 What Is Concurrency? 파이썬은 동기 방식으로 동작하도록 설계된 언어다. 그래서 파이썬에서는 thread, task, multiprocess 모듈를 사용해서 동시적으로 작업들을 처리할 수 있다. 고수준에서보면 세 가지 방법 모두 어떤 작업들을 동시에 처리한다는 점이서 비슷해보이지만, 내부를 파보면 서로 조금씩 다른 점이 있다. 쓰레드를 사용하는 threading 모듈, task를 사용하는 asyncio 모듈, 프로세스를 사용하는 multiprocessing 모듈이 있는데 이 중 정말로 동시에 병렬적으로 작업을 처리하는 것은 multiprocessing 뿐이다. threading과 asyncio 모듈은 모두 하나의 프로세서를 사용하기 때문에 한 번에 하나씩 작업을 실행할 수 밖에 없다. 다만.. 2022. 2. 15.
캐시와 조건부 요청 참고 및 정리: 위키피디아, 모든 개발자를 위한 HTTP 웹 기본 지식(김영한 님) 인프런 강의 캐시 위키피디아 캐시(cache)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 같은 데이터에 반복적으로 엑세스하는 경우나 잘 변하지 않는 데이터의 경우 캐시를 사용하면 더 빠른 속도로 데이터에 접근할 수 있다. 그래서 데이터의 재사용 횟수가 한 번 이상이어야 캐시는 의미가 있다. 여러가지 캐시의 종류 CPU 캐시 디스크 캐시 웹 캐시: 브라우저 캐시, 프록시 캐시 이번 포스팅에서는 웹 캐시를 정리하고자 한다. 캐시의 기본 정의에 따라 웹 캐시는 웹 페이지의 요소를 저장하기 위한 임시 저장소이다. HTTP 요청으로 가져올 수 있는 모든 종류의 리소스(HTML, CSS, JS, 이미지.. 2022. 2. 14.
쿠키(cookie), 세션(session) 쿠키 등장 배경 HTTP 프로토콜에는 비연결성(Connectionless)과 무상태성(Stateless)라는 특징 때문에 사용자의 요청에 대한 응답이 끝나면 연결 상태를 해제하고, 상태 정보를 저장하지 않기 때문에 서버의 자원을 크게 절약할 수 있었다. 그러나 이로 인해 사용자를 식별할 수 없어서 같은 사용자가 요청을 여러번 하더라도 매번 새로운 사용자로 인식하는 단점이 있다. 예를 들어 장바구니에 물품을 담은 경우 새로고침 시 장바구니가 초기화 되어 사용자가 불편을 겪게 된다. 마찬가지로 페이지를 이동할 때마다 로그인을 계속 해야 하는 불편함이 생기게 된다. 이 문제를 해결하기 위한 두 가지 방법이 있다. 1) 사용자 정보를 담은 임시 파일을 클라이언트에 저장하여, 서버는 이 파일로 클라이언트를 식별:.. 2022. 2. 12.