수집의 목적은 무엇입니까?체인맵?
Python 3.3에서는 클래스가 모듈에 추가되었습니다.
ChainMap 클래스는 여러 매핑을 단일 단위로 처리할 수 있도록 신속하게 연결하기 위해 제공됩니다.새 사전을 만들고 여러 개의 업데이트() 호출을 실행하는 것보다 훨씬 빠른 경우가 많습니다.
예:
>>> 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
생성됨).
제가 알기로는 사전을 하나 더 가지고 s로 유지하는 것에 대한 대안으로 알고 있습니다.
질문은 다음과 같습니다.
- 는 무엇을 합니까?
ChainMap
표지? - 의 실제 사례가 있습니까?
ChainMap
? - python3로 전환한 타사 라이브러리에서 사용됩니까?
보너스 질문: 파이썬 2.x에서 사용할 수 있는 방법이 있습니까?
Raymond Hettinger의 PyCon talk에서 들어본 적이 있는데, 툴킷에 추가하고 싶은데 언제 사용해야 하는지에 대한 이해가 부족합니다.
저는 @b4hand의 예를 좋아하며, 실제로 그가 언급한 두 가지 목적, 즉 다층 구성 오버라이드와 가변 스택/스코프 에뮬레이션을 위해 (ChainMap 자체는 아님) 과거 ChainMap과 같은 구조를 사용했습니다.
저는 두 가지 다른 동기/장점/차이를 지적하고 싶습니다.ChainMap
루프를 하여 "합니다. "dict-update" "final" "final" "final" "final" "final" "final" "final" "final" "final" "final" "final" "final" "final" "final" "
추가 정보: ChainMap 구조는 "계층화"되어 있으므로 다음과 같은 질문에 대한 답변을 지원합니다."기본" 값을 받습니까, 아니면 재정의된 값을 받습니까?원래("기본") 값은 얼마입니까?값이 어느 수준에서 재정의되었습니까(@b4hand의 구성 예: user-config 또는 명령줄-overrides)?간단한 받아쓰기를 사용하면 이러한 질문에 대답하는 데 필요한 정보가 이미 손실됩니다.
트레이드오프 속도 향상: 예를 들어,
N
및 이어및 대최레M
키를 사용하여 하려면 , ChainMap을 사용합니다.O(N)
그리고 각각의 조회 수O(N)
최악의 경우 [*], 업데이트 루프를 사용한 딕트 구축은 시간이 걸립니다.O(NM)
그리고 각각의 조회 수O(1)
즉, 자주 구성하고 매번 몇 가지 룩업만 수행하는 경우 또는M
ChainMap의 게으른 구성 방식은 당신에게 유리합니다.
(를 [*] (2)dict-access로 가정합니다.O(1)
실제로는O(1)
평적으로고, 리그균.O(M)
최악의 경우자세한 내용은 여기를 참조하십시오.
사용하는 것을 볼 수 있었습니다.ChainMap
명령행 옵션, 사용자 구성 파일 및 시스템 구성 파일과 같은 구성 범위가 여러 개인 구성 개체의 경우.조회는 생성자 인수의 순서에 따라 정렬되므로 낮은 범위에서 설정을 재정의할 수 있습니다.개인적으로 사용하거나 본 적이 없습니다.ChainMap
사용되었지만, 표준 라이브러리에 상당히 최근에 추가된 것이기 때문에 놀라운 일은 아닙니다.
또한 어휘 범위를 직접 구현하려는 경우 변수 바인딩을 푸시하고 팝업하는 스택 프레임을 에뮬레이트하는 데 유용할 수 있습니다.
ChainMap의 표준 라이브러리 문서는 타사 라이브러리의 유사한 구현에 대한 몇 가지 예와 링크를 제공합니다.구체적으로, 장고의 컨텍스트 클래스와 Enthought의 멀티 컨텍스트 클래스의 이름을 지정합니다.
한 번 해보겠습니다.
체인맵은 아주 그냥 추상적인 것처럼 보입니다.그것은 매우 전문적인 문제에 대한 좋은 해결책입니다.저는 이 사용 사례를 제안합니다.
다음이 있는 경우:
- 다중 매핑(예: 딕트)
- 이러한 매핑에서 키의 일부 중복(같은 키가 여러 매핑에 나타날 수 있지만 모든 키가 모든 매핑에 나타나는 경우는 아님)
- 주어진 키에 대한 모든 매핑에 대한 총 순서가 있는 "최고 우선순위" 매핑에서 키의 값에 액세스하기를 원하는 소비 응용 프로그램(즉, 매핑은 동일한 우선순위를 가질 수 있지만 이러한 매핑 내에 키의 중복이 없음이 알려진 경우에만).패키지는 동일한 디렉터리(같은 우선 순위)에 존재할 수 있지만 이름이 달라야 하므로 정의에 따라 해당 디렉터리의 기호 이름은 중복될 수 없습니다.
- 사용 중인 애플리케이션은 키 값을 변경할 필요가 없습니다.
- 동시에 매핑은 독립적인 정체성을 유지해야 하며 외부 힘에 의해 비동기적으로 변경될 수 있습니다.
- 매핑은 액세스할 수 있을 만큼 충분히 크고, 비용이 많이 들거나, 애플리케이션 액세스 간에 자주 변경되므로, 애플리케이션에 필요할 때마다 예상치를 계산하는 데 드는 비용(3)은 애플리케이션의 성능에 상당한 문제가 됩니다.
그런 다음 체인 맵을 사용하여 매핑 모음에 대한 보기를 만드는 것을 고려할 수 있습니다.
하지만 이것은 모두 사후적인 정당성입니다.파이썬 사람들은 문제가 있었고, 코드의 맥락에서 좋은 해결책을 생각해냈고, 우리가 선택한다면 사용할 수 있도록 그들의 해결책을 추상화하기 위해 추가 작업을 했습니다.그들에게 더 많은 힘을.하지만 그것이 여러분의 문제에 적합한지 여부는 여러분이 결정할 일입니다.
불완전한 답변:
보너스 질문: 파이썬 2.x에서 사용할 수 있는 방법이 있습니까?
from ConfigParser import _Chainmap as ChainMap
하지만 이것은 진짜가 아니라는 것을 명심하세요.ChainMap
에서 상속됩니다.DictMixin
정의는 다음과 같습니다.
__init__(self, *maps)
__getitem__(self, key)
keys(self)
# And from DictMixin:
__iter__(self)
has_key(self, key)
__contains__(self, key)
iteritems(self)
iterkeys(self)
itervalues(self)
values(self)
items(self)
clear(self)
setdefault(self, key, default=None)
pop(self, key, *args)
popitem(self)
update(self, other=None, **kwargs)
get(self, key, default=None)
__repr__(self)
__cmp__(self, other)
__len__(self)
또한 구현이 특별히 효율적인 것 같지는 않습니다.
언급URL : https://stackoverflow.com/questions/23392976/what-is-the-purpose-of-collections-chainmap
'programing' 카테고리의 다른 글
데이터 그리드에서 선택한 행의 색상을 설정하는 방법 (0) | 2023.05.26 |
---|---|
C++ 문자열 ==과 비교()의 차이점은 무엇입니까? (0) | 2023.05.26 |
바이트[] 배열을 C#의 파일에 쓸 수 있습니까? (0) | 2023.05.26 |
WPF 데이터를 인터페이스에 바인딩하고 실제 객체가 아님 - 캐스팅이 가능합니까? (0) | 2023.05.26 |
Bash 스크립트가 빈 줄로 "명령을 찾을 수 없음"을 인쇄함 (0) | 2023.05.26 |