collections.ChainMap的目的是什么?

发布于 2021-01-29 19:21:02

在Python
3.3中ChainMap,向该collections模块添加了一个类:

提供ChainChain类,用于快速链接许多映射,因此可以将它们视为一个单元。它通常比创建新字典并运行多个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 PythonRaymond
Hettinger的PyCon演讲中已经听说过,我想将其添加到我的工具箱中,但是我不知道何时应该使用它。

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我喜欢@
    b4hand的示例,确实,过去我曾使用过类似ChainMap的结构(但不使用ChainMap本身)来实现他提到的两个目的:多层配置覆盖和变量堆栈/作用域仿真。

    ChainMap与使用dict-update循环相比,我想指出的其他两个动机/优势/区别,因此仅存储“最终”版本”:

    1. 详细信息: 由于ChainMap结构是“分层的”,因此它支持回答以下问题:我得到“默认”值还是被覆盖?什么是原始(“默认”)值?该值在什么级别被覆盖(借用@ b4hand的配置示例:user-config或command-line-overrides)?使用简单的字典,回答这些问题所需的信息已经丢失。

    2. 速度权衡: 假设每个N层都有层,并且最多有M键,构造ChainMap需要O(N)和每个查询的O(N)最坏情况[*],而构造一个使用update-loop需要O(NM)和每个查询的字典O(1)。这意味着,如果您经常构造并且每次仅执行几次查找,或者查找次数M很大,ChainMap的惰性构造方法将对您有利。

    [*](2)中的分析假设dict-
    access为O(1),而实际上它是O(1)平均水平,并且是O(M)最坏的情况。在这里查看更多详细信息。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看