json.dump() は ensure_ascii=False の方が遅かった

Python の標準ライブラリの json モジュールのエンコード機能には ensure_ascii というオプションがあり、デフォルトでは True です。このオプションが真のときは、非ASCII文字を全て "\uXXXX" の形にエスケープします。

ensure_ascii=True の方が安全ですが、DBにjsonシリアライズしたデータを突っ込むなどの用途ではFalseの方がコンパクトになるし、日本語等を含む場合にエスケープされずに読みやすいので、 ensure_ascii=False を多用していました。

ensure_ascii=False はエスケープ処理が減る分速度も向上すると特に実験もせずに信じていたのですが、社内のプロジェクトで ensure_ascii=True の方が圧倒的に速いという報告を受けて、確認してみたら確かに ensure_ascii=True の方が速かったです。

ソースコードを確認したところ、 ensure_ascii=False の場合はエスケープ処理を正規表現の置換で行う一方、 ensure_ascii=True の場合は _json という speedup モジュールを使って高速に処理していました。

ensure_ascii=False の場合用の speedup 関数を追加するパッチを作って 報告 しておいたので、取り込まれれば Python 3.5 からは同等以上の速度になるはずです。

追記

コミットされました

Issue #23206: Make ``json.dumps(..., ensure_ascii=False)`` as fast as th... · ae9739e · python/cpython · GitHub

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。