1. ホーム
  2. python

[解決済み] collections.ChainMapの目的は何ですか?

2023-07-02 06:52:09

質問

Python 3.3では ChainMap クラスが追加され collections モジュールに追加されました。

ChainMapクラスは、いくつかのマッピングを素早くリンクし、一つのユニットとして扱えるようにするために提供されます。 を素早くリンクするために提供されています。これは多くの場合 新しい辞書を作成し、複数のupdate()コールを実行するよりもはるかに高速です。

例を挙げます。

>>> from collections import ChainMap
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 10, 'c': 11}
>>> z = ChainMap(y, x)
>>> for k, v in z.items():
        print(k, v)
a 1
c 11
b 10

動機となったのは この問題 によって公開され これ (ノ PEP は作成されませんでした)。

私が理解する限り、これは余分な辞書を持ち、それを update() s.

という質問があります。

  • どのようなユースケースで ChainMap はどのようなケースをカバーしていますか?
  • の実例はありますか? ChainMap ?
  • Python3に移行したサードパーティライブラリで使用されているのでしょうか?

ボーナス質問:Python2.x上でそれを使用する方法はありますか?


で聞いたことがあります。 Transforming Code into Beautiful, Idiomatic Python Raymond HettingerによるPyConのトークで聞いたことがあり、自分のツールキットに加えたいと思っていますが、いつ使うべきかの理解に欠けています。

どのように解決するのですか?

私は @b4hand の例が好きで、実際、私は過去に ChainMap のような構造体 (ChainMap 自体ではない) を、彼が言及した 2 つの目的、すなわち多層の設定オーバーライド、および変数スタック/スコープ エミュレーションに使用したことがあります。

の他の 2 つの動機/利点/相違を指摘したいと思います。 ChainMap と、dict-update ループを使用し、したがって "最終バージョン" を保存するだけであることと比較して。

  1. 詳細はこちら。 ChainMap構造はquot;layered"なので、以下のような質問に答えることをサポートします。私はデフォルト値、またはオーバーライドされた値を取得していますか?元の ("default") 値は何ですか? その値はどのレベルでオーバーライドされたのか(@b4hand の設定の例:user-config または command-line-overrides を借用)?単純なdictを使用すると、これらの質問に答えるために必要な情報はすでに失われています。

  2. 速度のトレードオフ。 もし、あなたが N レイヤーがあり、最大で M のキーを持つ、ChainMap を構築するには O(N) で、それぞれのルックアップは O(N) を要するのに対し、更新ループを用いたdictの構築は、最悪[*]に O(NM) を要し、各ルックアップは O(1) . つまり、頻繁に構築し、毎回数回のルックアップしか行わない場合、あるいは M が大きい場合、ChainMapの遅延構築のアプローチは有利に働きます。

[*] (2)の解析では、dict-accessを想定しています。 O(1) であると仮定していますが、実際には O(1) であり O(M) が最悪の場合です。詳細を見る こちら .