Python

파이썬에서 더 빠른 JSON serialization 사용하기

검정비니 2024. 1. 22. 22:03
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 직렬화 및 역직렬화를 위해서는 ujsonorjson이 사용된다.

 

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배정도 빠르다.

 

반응형