사전 보기 개체란 무엇입니까?
python 2.7에서는 사전 보기 방법을 사용할 수 있습니다.
이제 다음의 장단점을 알게 되었습니다.
dict.items()
)values
,keys
할 수 . 목록을 반환하므로 실제로 결과를 저장할 수 있습니다.dict.iteritems()
(등): 생성기를 반환하므로 생성된 각 값을 하나씩 반복할 수 있습니다.
란?dict.viewitems()
이유로 (▁what것))은 무엇입니까?그들의 이점은 무엇입니까?어떻게 작동합니까?결국 경치란 무엇입니까?
나는 보기가 항상 사전의 변경 사항을 반영한다고 읽었습니다.그러나 성능 및 메모리 관점에서 어떻게 작동합니까?장점과 단점은 무엇입니까?
사전 보기는 기본적으로 이름과 같습니다. 보기는 사전의 키와 값(또는 항목)에 있는 창과 같습니다.다음은 Python 3 공식 문서에서 발췌한 내용입니다.
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> keys # No eggs anymore!
dict_keys(['sausage', 'bacon', 'spam'])
>>> values # No eggs value (2) anymore!
dict_values([1, 1, 500])
는 (Python 2 동는용사도용다니됩로한등다▁(▁(py니사됩용)를 사용합니다.dishes.viewkeys()
그리고.dishes.viewvalues()
.)
이 예에서는 보기의 동적 특성을 보여 줍니다. 키 보기는 지정된 시점의 키 복사본이 아니라 키를 보여주는 단순한 창입니다. 키가 변경되면 창을 통해 표시되는 내용도 변경됩니다.이 기능은 상황에 따라 유용할 수 있습니다(예를 들어 필요할 때마다 현재 키 목록을 다시 계산하는 대신 프로그램의 여러 부분에 있는 키에 대한 뷰로 작업할 수 있습니다). 보기를 반복하는 동안 사전 키가 수정되면 반복자가 어떻게 행동해야 하는지 잘 정의되지 않습니다.오류가 발생할 수 있습니다.
한 가지 장점은 키가 작고 고정된 양의 메모리만 사용하고 키 목록이 생성되지 않기 때문에 프로세서 시간이 작고 고정되어 있다는 것입니다(반면 Python 2는 종종 불필요하게 새로운 목록을 생성합니다). 이 목록은 메모리와 시간이 필요합니다(Rajendran T의 인용).목록의 길이)를 선택합니다.창 유사성을 계속하려면 벽 뒤에 있는 풍경을 보려면 창을 열기만 하면 됩니다(창을 작성). 키를 목록에 복사하면 대신 벽에 풍경 복사본을 그리는 것과 일치합니다. 복사본은 시간과 공간이 걸리고 자체 업데이트되지 않습니다.
요약하면, 보기는 사전의 보기(창)로, 사전이 변경된 후에도 사전의 내용을 표시합니다.목록과 다른 기능을 제공합니다. 키 목록에는 특정 시점의 사전 키 복사본이 포함되어 있는 반면 보기는 동적이며 데이터(키 또는 값)를 복사할 필요가 없기 때문에 가져오기가 훨씬 빠릅니다.
문서를 읽는 것만으로도 다음과 같은 인상을 받습니다.
- 보기는 인덱싱을 지원하지 않기 때문에 구성원 자격을 테스트하고 반복할 수 있습니다(키는 해시 가능하고 고유하기 때문에 키와 항목 보기에 중복 항목이 없다는 점에서 더 "설정된 것").
- 목록 버전과 같이 여러 번 저장하고 사용할 수 있습니다.
- 기본 사전을 반영하기 때문에 사전을 변경하면 보기가 변경되고 반복 순서가 거의 확실하게 변경됩니다.따라서 목록 버전과 달리 "안정적"은 아닙니다.
- 기본 사전을 반영하기 때문에 거의 틀림없이 작은 프록시 개체입니다. 키/값/항목을 복사하려면 어떻게든 원본 사전을 보고 변경 사항이 발생할 때 여러 번 복사해야 합니다. 이는 터무니없는 구현입니다.따라서 메모리 오버헤드가 거의 없을 것으로 예상되지만 사전에 직접 액세스하는 것보다 액세스 속도가 약간 느립니다.
따라서 핵심 활용 사례는 사전을 보관하고 키/항목/값을 중간에 수정하여 반복하는 경우입니다.당신은 그냥 뷰를 사용할 수 있어요.for k, v in mydict.iteritems():
안으로for k, v in myview:
하지만 만약 당신이 사전을 한 번 반복하고 있다면, 나는 여전히 반복 버전이 더 좋다고 생각합니다.
하신 dict.items()
"키, 값"인 사전의 (합니다.dict.iteritems()
사전의 (키, 값) 쌍을 통해 반복기를 반환합니다.
이제 다음 예제를 사용하여 딕트 인터레이터와 딕트 뷰 간의 차이를 확인합니다.
>>> d = {"x":5, "y":3}
>>> iter = d.iteritems()
>>> del d["x"]
>>> for i in iter: print i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
반면에 보기는 단순히 받아쓰기에 무엇이 있는지 보여줍니다.바뀌어도 상관없습니다.
>>> d = {"x":5, "y":3}
>>> v = d.viewitems()
>>> v
dict_items([('y', 3), ('x', 5)])
>>> del d["x"]
>>> v
dict_items([('y', 3)])
보기는 단순히 사전의 현재 모습입니다.항목 삭제 후.items()
시대에 뒤떨어졌을 것이고.iteritems()
실수를 했을 겁니다
보기 메서드는 목록을 반환합니다(목록의 복사본이 아니라)..keys()
,.items()
그리고..values()
), 그래서 더 가볍지만, 사전의 현재 내용을 반영합니다.
Python 3.0에서 - dict 메서드가 뷰를 반환합니다. - 왜?
주요 이유는 많은 사용 사례에서 완전히 분리된 목록을 반환하는 것이 불필요하고 낭비적이기 때문입니다.전체 콘텐츠를 복사해야 합니다(많거나 많지 않을 수 있음).
키 위에서 반복하려는 경우에는 새 목록을 만들 필요가 없습니다.또한 별도의 목록(복사본)으로 필요한 경우 보기에서 해당 목록을 쉽게 만들 수 있습니다.
보기를 사용하면 기본 데이터 구조를 복사하지 않고 액세스할 수 있습니다.목록을 만드는 것과 반대로 역동적인 것 외에도, 그들의 가장 유용한 사용법 중 하나는in
test. 값이 딕트에 있는지 확인하고 싶다고 합니다(키 또는 값).
옵션 1은 다음을 사용하여 키 목록을 만드는 것입니다.dict.keys()
이것은 작동하지만 분명히 더 많은 메모리를 소비합니다.받아쓰기가 매우 큰 경우?그것은 낭비입니다.
와 함께views
중간 목록 없이 실제 데이터 구조를 반복할 수 있습니다.
예를 들어 보겠습니다.무작위 문자열과 숫자로 된 1000개의 키를 가진 딕트가 있고,k
제가 찾고 싶은 열쇠입니다.
large_d = { .. 'NBBDC': '0RMLH', 'E01AS': 'UAZIQ', 'G0SSL': '6117Y', 'LYBZ7': 'VC8JQ' .. }
>>> len(large_d)
1000
# this is one option; It creates the keys() list every time, it's here just for the example
timeit.timeit('k in large_d.keys()', setup='from __main__ import large_d, k', number=1000000)
13.748743600954867
# now let's create the list first; only then check for containment
>>> list_keys = large_d.keys()
>>> timeit.timeit('k in list_keys', setup='from __main__ import large_d, k, list_keys', number=1000000)
8.874809793833492
# this saves us ~5 seconds. Great!
# let's try the views now
>>> timeit.timeit('k in large_d.viewkeys()', setup='from __main__ import large_d, k', number=1000000)
0.08828549011070663
# How about saving another 8.5 seconds?
보다시피, 반복적으로view
객체는 성능을 크게 향상시켜 메모리 오버헤드를 동시에 줄입니다.작업을 수행해야 할 때 사용해야 합니다.Set
작전과 같은
참고: Python 2.7에서 실행 중입니다.
언급URL : https://stackoverflow.com/questions/8957750/what-are-dictionary-view-objects
'programing' 카테고리의 다른 글
Angular 2 불투명 토큰 대 Angular 4 주입상품권 (0) | 2023.06.26 |
---|---|
Mongoose와 함께 _id로 검색 (0) | 2023.06.26 |
C/C++ 애플리케이션의 메모리 누수를 감지하기 위해 Mac OS X Mountain Lion 및 Mavericks에서 Valgrind를 대체할 방법이 있습니까? (0) | 2023.06.26 |
파이어베이스 안드로이드에서 특정 값에 대한 푸시된 ID 가져오기 (0) | 2023.06.26 |
SQL Server 2005 데이터베이스의 모든 보기를 나열하는 SQL 쿼리 (0) | 2023.06.26 |