標準の JSON 機能を使用して、定期的に JSON ファイルを Python にダンプおよびロードするアプリケーションがあります。
早い段階で、読み込まれた JSON データを辞書ではなくオブジェクトとして操作する方がはるかに便利であると判断しました。[]
これは、ディクショナリ キー ルックアップの表記法とは対照的に、「ドット」メンバー アクセスの利便性に帰着します。Javascript の利点の 1 つは、辞書検索とメンバー データ アクセスの間に実際の違いがないことです (これが、JSON が Javascript に特に適している理由だと思います)。しかし、Python では、辞書キーとオブジェクト データ メンバーは別物です。
object_hook
したがって、私たちの解決策は、関数を使用して辞書の代わりにオブジェクトを返すカスタム JSON デコーダーを使用することでした。
そして、私たちは幸せに暮らしました... この設計上の決定が間違いであることが判明するまで. ご覧のとおり、JSON ダンプ ファイルはかなり大きくなりました (> 400 MB)。私の知る限り、標準の Python 3 JSON 機能はネイティブ コードを使用して実際の解析を行うため、非常に高速です。ただし、 customobject_hook
を指定した場合でも、デコードされた JSON オブジェクトごとに解釈されたバイト コードを実行する必要があります。これにより、処理が大幅に遅くなります。それがなければobject_hook
、400 MB のファイル全体をデコードするのに約 20 秒しかかかりません。しかし、フックを使用すると、30 分以上かかります。
したがって、この時点で 2 つのオプションが思い浮かびますが、どちらもあまり快適ではありません。1 つは、"ドット" メンバー データ アクセスを使用する便利さを忘れて、Python 辞書だけを使用することです。(これは、かなりの量のコードを変更することを意味します。) もう 1 つは、C 拡張モジュールを作成し、それを として使用して、object_hook
速度が向上するかどうかを確認することです。
私が考えていないより良い解決策があるかどうか疑問に思っています-おそらく、最初はPython辞書にデコードしながら、「ドット」メンバーへのアクセスを取得するより簡単な方法です。
この問題に対する提案、解決策はありますか?