Python 5

sqlalchemy에서 joinedload와 Query.join()의 차이점

tl;dr joinedload를 사용하면 JOIN된 전체 attribute들을 select하나, Query.join()은 query의 대상이 되는 table의 항목들만 select의 대상이 된다. 이 글은 SQLAlchemy의 공식 문서를 번역한 것입니다. 원문: https://docs.sqlalchemy.org/en/14/orm/loading_relationships.html#sqlalchemy.orm.joinedload Joinedload는 Query.join()의 사용과 많은 유사점이 있기 때문에, 언제 어떻게 사용해야 하는지에 대해 혼동을 일으키는 경우가 많습니다. Query.join()은 쿼리 결과를 변경하는 데 사용되는 반면, joinedload()는 쿼리 결과를 변경하지 않고 렌더링된 조인의..

Python/sqlalchemy 2023.10.22

Python gc 튜닝을 통한 성능 개선 (Flask 기반 예시 코드)

일반적으로 파이썬 환경은 CPython을 의미하기 때문에, 이 문서에서 다루는 내용 역시 CPython 인터프리터에 대한 실험을 포함하고 있습니다. PyPy나 RustPython과 같은 환경에서는 또 다른 상황이 발생할 수 있다는 점을 미리 고지드립니다. CPython에서 gc의 동작 원리 기본적으로 파이썬의 gc는 reference count를 기반으로 작동을 하게 된다. CPython에서 class 등을 통해 만들어진 인스턴스나 기본형 데이터 등이 생성되게 되면 내부적으로 PyObject 타입의 struct에 대해 memory allocation이 발생하게 된다. 그리고 CPython은 할당된 메모리의 관리를 위해 reference list에 생성된 PyObject에 대한 reference를 추가함으..

Python 2023.10.14

Dropzone.js를 사용해 대용량 파일 업로드 API 성능 개선

파일 업로드 일반적으로 파일 업로드를 할 때에는 multipart/form-data 형식으로 업로드를 진행하도록 API를 디자인하게 된다. 이때, 일반적인 파일들은 파일 크기가 그렇게 크지 않겠지만, 영상 파일과 같이 용량이 GB 단위가 되는 경우에는 단순히 한번의 요청으로 전체 파일을 올리는 것이 매우 어려워지게 된다. 다음 코드는 multipart/form-data 형식으로 데이터를 업로드하기 위한 API를 Flask와 flask-restx로 구현한 간단한 예제이다: import uuid from flask import request, make_response from flask_restx import Resource, Namespace from werkzeug.utils import secure_f..

Python/Flask 2023.10.09

소스코드 레벨에서 비교하는 Python List와 Set의 차이

Python에서 Set과 List List는 순서가 있고 mutable한 객체 집합이며, Set은 순서가 없고 mutable한 고유한 객체 집합이다. 두 자료구조 사이의 가장 큰 차이는 1) 객체의 중복 허용 여부와 2) 순서를 가지고 있는가 이다. 순서가 중요할 때에는 List를 사용하며, 객체의 중복을 배제하고 싶을 때에는 Set을 사용하는 것이 좋다. 그런데, 만약 중복이 없는 배열이 필요한 상황에서는 list와 set 중 어느 것을 사용하는 것이 좋을까? 둘 중 하나를 고르는 것이 실질적으로 어플리케이션의 성능에 큰 차이를 가져올 수 있을까? CPython 소스코드 레벨로 이해하는 List CPython 소스코드를 보게되면 List는 PyObject의 array의 포인터를 가지는 형태의 구조체로 ..

Python 2023.10.09

Flask에서 async 기반 API 구현하기

Flask에서 async API 만들기? 일반적으로 Flask는 wsgi와 연동되도록 synchronous하게 동작하는 것을 기대하고 구현되었기 때문에 async 함수 없이 구현하는 것이 일반적인 패턴이다. 그러나 경우에 따라 필요에 의해 Flask 서버에 비동기 non-blocking I/O 기반 기능을 추가해야 할 경우가 발생하게 된다. 애초에 async 함수로 구현되는 FastAPI에서는 그다지 할 필요가 없는 고민이긴 하다. 어찌되었든, Flask에서 비동기를 사용하고 싶다면 어떤 방법으로 문제를 해결할 수 있을까? 가장 간단한 방법으로는 `asyncio`를 사용해서 비동기적인 I/O 기능을 할 수 있도록 만들고, 이를 Flask 코드와 연결시키면 된다. 눈치 챈 사람들도 있겠지만, 파이썬에서 함..

Python/Flask 2023.10.09