하이 레벨 프레임워크
https://velog.io/@loooggi/0103-TIL
많은 기능들이 구현되어있어서 무겁다
그래서 느리다 (하지만 이용자가 많지 않다면 아직 괜찮다)
https://velog.io/@poding84/Django%EC%99%80-Python
Django를 백엔드 스택으로 선정한 이유는 무엇입니까?
웹 페이지를 만드는 전 과정을 빠르게 익힌 후 스택을 넓혀보자는 생각으로 장고를 선택하게 되었습니다. 이미 구현되어있는 기능들이 많고 ORM이나 객체지향적 면이 다른 언어들보다 좀 더 짧은 기간 안에 배우기 좋다고 생각했습니다.
+파이썬 AI
+개발자들이 웹사이트를 개발할 때 실수하기 쉽지만 고려해야하는 보안 문제에 대해서 많은 도움을 줍니다.
Django가 다른 Python 웹 프레임워크와 비교되는 특징이 있다면 무엇입니까?
장고는 풀스택 프레임워크이며 보안, ORM 등 기본적인 기능이 거의 다 구현이 되어있어 개발 시간을 단축하고 생산성이 높습니다.
https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Introduction
https://happyhaelee.tistory.com/56
구성요소가 M,T,V,로 분리되어 각각의 역할에 충실하도록 해서 유연성이 좋고 유지보수가 용이함
+MVP, MVVM 패턴
장고에서 프로젝트를 만들고 기능을 담당하는 앱을 구현할 때 models.py views.py urls.py 에 구현..
DB에 저장되는 데이터
하나의 클래스가 하나의 DB 테이블에 해당함
유저에게 보여지는 화면
html 파일을 context와 함께 렌더링
요청에 따라 적절한 로직을 수행하여 결과를 템플릿으로 렌더링하며 응답
https://livetodaykono.tistory.com/40
https://tibetsandfox.tistory.com/16
views.py
파이썬에는 Global Interpreter Lock
이라는 게 있는데
파이썬 인터프리터가 하나의 Thread만 하나의 Byte code로 실행할 수 있도록 하는 것
즉 하나의 Thread에게 모든 자원의 점유를 허락
즉 하나의 Thread가 인터프리터의 모든 것을 가짐
➡️ 파이썬은 멀티스레드 프로그래밍이 제한되어있다 !
순차적으로 리스폰스를 수행해서 웹서버를 연동하여 프로세스를 늘려 개선한다
django
Flask
역시 비동기가 최고다
sanic
vibora
FastAPI
*asyncio
Pyramid: 개발 규모에 관계없이 빠르게 구현할 수 있음
Tornado: 실시간 웹서버
+SQLAlchemy
https://mokeya.tistory.com/109
https://mokeya.tistory.com/152
https://core-research-team.github.io/2020-03-30/Python-Async-Sync-Web-Framework#python-async-web-framework
https://dojang.io/mod/page/view.php?id=2469
https://wikidocs.net/175092
def solution(participant, completion):
if len(participant)==len(set(participant)):
return (set(participant)-set(completion)).pop()
else:
for i,j in zip(sorted(participant),sorted(completion)):
if i != j:
return i
# 짧은 버전
def solution(participant, completion):
for i,j in zip(sorted(participant),sorted(completion)):
if i != j:
return i
return sorted(participant)[-1]
참가자 중에 같은 이름이 있는지 보고 없으면 차집합으로 답을 구하고 요소 값을 어떻게 뺄까 생각하다가 pop을 써봤다
동명이인이 있다면 정렬된 리스트 짝을 지어서 최초로 짝이 서로 이름이 다를 때의 참가자 이름을 리턴한다
두번째 풀이에서
zip은 짧은 리스트 만큼만 쌍이 만들어져서 동명이인이 없을 경우 for문에서 리턴하지 못하기때문에 그런 경우 정렬된 리스트의 마지막 값을 리턴해줘야한다
시간이 너무 오래걸려서 어떻게 바꿔볼까 생각하다가
zip()이 메모리 효율을 좀 저하시킨다고 어디서 본 게 있어서
zip()을 안쓰려고 어제 본 리스트 축약식 하려다가 망하면서 알게된 거
# else문에서 시도한 것
[i for i in sorted(["mislav", "stanko", "mislav", "ana"]) for j in sorted(["stanko", "ana", "mislav"]) if i != j]
# 어떻게 실행되는지 실험해본 것
[i+j for i in sorted(["mislav", "stanko", "mislav", "ana"]) for j in sorted(["stanko", "ana", "mislav"]) ]
# ['anaana', 'anamislav', 'anastanko', 'mislavana', 'mislavmislav', 'mislavstanko', 'mislavana', 'mislavmislav', 'mislavstanko', 'stankoana', 'stankomislav', 'stankostanko']
이렇게 for문을 2개 쓰게되면 각 범위의 모든 조합이 다 나온다
그래서 총 12개가 나온다
def solution(participant, completion):
participant.sort()
completion.sort()
for i in range(len(completion)):
if participant[i] != completion[i]:
return participant[i]
return participant[len(participant)-1]
zip대신 인덱스 값으로 비교
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
collections모듈의 Counter는 중복된 데이터가 저장된 배열을 인자로 받았을 때 각 원소의 빈도를 딕셔너리 형태로 저장한다
리스트의 경우 리스트 요소들 각각의 빈도를
스트링의 경우 각 글자들의 빈도를 저장한다
Counter({'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
카운터 객체를 리턴하면 이런 모양 딕셔너리의 키/밸류 객체 리턴 모양과 동일하다
counter(대상).most_common(k)
가장 출현 빈도가 높은 요소 순서대로 k개 출력
[(요소,빈도수)] 형태로 리턴하고 이 리스트의 길이는 k가 됨
ex. if k==1: 최빈값을 가지는 요소만 리턴
카운터 객체끼리 연산이 가능하다
이 풀이에서도 카운터끼리 뺐는데, 이러면 어떤 요소 하나만 남게되고 딕셔너리 형태로 결과가 나오기 때문에 key값을 리턴해주면 된다 Counter({'A': 1})
https://www.daleseo.com/python-collections-counter/
def solution(participant, completion):
answer = ''
temp = 0
dic = {}
for part in participant:
dic[hash(part)] = part
temp += int(hash(part))
for com in completion:
temp -= hash(com)
answer = dic[temp]
return answer
파이썬 내장 hash함수를 사용해서 각 선수들의 이름을 해싱해서 key로 만들고 그 이름을 value로 저장한다
temp에 그 값들을 다 더해서 넣고 완주한 선수들의 요소들도 각각 해싱해서 temp에서 빼주면 마지막 남은 1명의 완주자 이름에 해당하는 값만 키값으로 남게되어 밸류값을 찾으면 된다
이 방법은 1명이니까 가능한 방법 다빼고 남은 숫자가 같아야하니까
temp가 overflow날 일은 없을 듯 합니다. python의 경우 int범위를 벗어나면 Long이되고 long은 한계가 없네요
def solution(participant, completion):
result = {}
for a in participant:
result[a] = result.get(a, 0) + 1
for b in completion:
result[b] -= 1
if result[b] == 0:
del result[b]
return list(result.keys())[0]
모든 키값에 해당하는 밸류값이 1이 되고 두번째 for문에서 완주자라면 value값이 0이 되고, value값이 0인 경우 해당 요소를 삭제해버리면 하나만 남게 된다
효율성 테스트에서 되게 크게 차이는 나지 않았지만 해시는 원래 엄청 효율적으로 삽입 및 조회를 할 수 있다고 한다
(전체 자료를 검색해야하는 최솟값, 최댓값의 경우에는 효율이 낮다)
플라스크 프레임워크: 풀스택으로써 처리해줄 수 있는 기능이 없다