日々のあれこれφ(..)

もっぱら壁打ち

【Python】jsonライブラリのベンチマークを測った

ソースコードの全体は以下です。

github.com

内容としては設定ファイル(settings.py)に比較したいPythonjsonライブラリと、読み込むjsonファイルのパス、テストする回数等を記載し、実行するだけです。

# settings.py

MODULES = ("json", "orjson", "rapidjson", "simplejson", "ujson")

COMPLEX_FILE = "./test_data/COMPLEX.json"
SIMPLE_FILE = "./test_data/SIMPLE.json"

REPEAT = 10
NUMBER = 10000

ベンチマークの部分は以下。

def benchmark_dumps(m, data: str, r: int, n: int):
    return min(repeat(lambda: m.dumps(data), repeat=r, number=n))


def benchmark_loads(m, data: str, r: int, n: int):
    return min(repeat(lambda: m.loads(data), repeat=r, number=n))

timeit.repeat()でr回(今回は10)メソッドの実行を行うことをn回(今回は10000)繰り返し、最小値を結果としています。

結果はcsv形式で出力されるので、excelスプレッドシートで開いて早かった順に並び替えたりグラフ化したりします。

検証結果

  • t2.micro
  • Ubuntu 18.04(ami-0fe22bffdec36361c)
  • Python 3.9.6

で実行した結果、以下のようになりました。

COMPLEX JSON

jsonデータはいずれも拾った適当なものです。

COMPLEX.json

f:id:reiichii:20210831082540p:plain

SIMPLE JSON

SIMPLE.json

f:id:reiichii:20210831082658p:plain

データの種類や処理に関係なく私の環境では以下の順に速かったです。

  1. orjson
  2. ujson
  3. rapidjson
  4. json
  5. simplejson

おわりに

もはや何番煎じみたいなネタですが、自分で検証できる手段は持っておきたかったのと、同じ処理を複数のライブラリで実行するコードを書きたかったという試みでした。(それに自分で検証するの大事)

今回は技術選定目的ではなかったのですが、実際にそれ目的で検証する機会があったときにデータ見直してこのコード使ってまたできたらなと。

参考

Benchmark of Python JSON libraries - Artem Krylysov

今回検証したjsonライブラリについて

標準のjsonモジュール

orjson

python-rapidjson

simplejson

ujson