728x90
반응형
보통 파이썬에서 JSON을 string으로 직렬화(serialization)하거나 직렬화된 데이터로부터 JSON 객체(dict 타입)를 로딩하는 방법은 아래와 같이 json 표준 모듈을 사용하는 것이다.
import json
data = {'a': 'a', 'b': 'b'}
data_str = json.dumps(data)
new_data = json.load(data_str)
그러나, 이 표준 라이브러리는 파이썬으로 구현되어 있기 때문에 C/C++이나 Rust로 구현된 구현체들보다 더 느리다.
보통 빠른 JSON 직렬화 및 역직렬화를 위해서는 ujson과 orjson이 사용된다.
ujson은 C로 작성된 JSON 모듈의 파이썬 바인딩이다. 해당 라이브러리는 파이썬 3.7부터 지원되고 있다.
orjson은 핵심 기능이 Rust로 작성된 파이썬 라이브러리로, numpy.ndarray나 dataclasses 등 다양한 타입을 지원한다.
단, numpy.float64 등과 같은 일부 라이브러리들의 커스텀 타입들은 지원하지 않는다.
성능 벤치마크
import time
import json
import orjson
import ujson
def benchmark(name, dumps, loads):
start = time.time()
for i in range(3000000):
result = dumps(m)
loads(result)
print(name, time.time() - start)
if __name__ == "__main__":
m = {
"timestamp": 1556283673.1523004,
"task_uuid": "0ed1a1c3-050c-4fb9-9426-a7e72d0acfc7",
"task_level": [1, 2, 1],
"action_status": "started",
"action_type": "main",
"key": "value",
"another_key": 123,
"and_another": ["a", "b"],
}
benchmark("Python", json.dumps, json.loads)
benchmark("ujson", ujson.dumps, ujson.loads)
# orjson only outputs bytes, but often we need unicode:
benchmark("orjson", lambda s: str(orjson.dumps(s), "utf-8"), orjson.loads)
위의 코드를 실행시켜보면 확실히 표준 라이브러리와 ujson 그리고 orjson 사이의 성능 차이를 느낄 수 있다.
표준 json 라이브러리는 3백만개의 데이터를 처리하는데 12초 가량이 소요되는 반면, ujson은 4.42초 가량이 소요되고 orjson은 약 2.3초 가량이 소요된다.
즉, json 대비 ujson은 약 3배정도 빠르고 orjson은 약 6배정도 빠르다.
반응형
'Python' 카테고리의 다른 글
PDF table-extraction (표 추출) 실험 (with pdfplumber, camelot, tabula-py) (2) | 2024.07.22 |
---|---|
python psutil을 사용해서 간단한 모니터링 스크립트 구축하기 (0) | 2024.01.02 |
Python gc 튜닝을 통한 성능 개선 (Flask 기반 예시 코드) (0) | 2023.10.14 |
pip-audit과 GitHub Actions를 활용한 취약 라이브러리 탐지 파이프라인 구축하기 (0) | 2023.10.09 |
소스코드 레벨에서 비교하는 Python List와 Set의 차이 (2) | 2023.10.09 |