복붙노트

[PYTHON] 사전보기 객체 란 무엇입니까?

PYTHON

사전보기 객체 란 무엇입니까?

파이썬 2.7에서는 사전보기 메소드를 사용할 수있게되었습니다.

이제 저는 다음과 같은 찬반 양론을 알고 있습니다 :

dict.viewitems () (와 같은) 무엇입니까? 그들의 이익은 무엇입니까? 어떻게 작동합니까? 결국 뷰는 무엇입니까?

나는 그 견해가 항상 사전으로부터의 변화를 반영하고 있다는 것을 읽었다. 그러나 그것은 perf와 memory의 관점에서 어떻게 행동할까요? 장단점은 무엇입니까?

해결법

  1. ==============================

    1.사전보기는 본질적으로 그 이름이 말하는 것입니다 :보기는 단순히 사전의 키와 값 (또는 항목)에 대한 창과 같습니다. 다음은 Python 3의 공식 문서에서 발췌 한 내용입니다.

    사전보기는 본질적으로 그 이름이 말하는 것입니다 :보기는 단순히 사전의 키와 값 (또는 항목)에 대한 창과 같습니다. 다음은 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에서는 dish.viewkeys ()와 dishes.viewvalues ​​()를 사용합니다.)

    이보기는 동적보기 문자를 보여줍니다. 키보기는 주어진 시점의 키 사본이 아니라 키를 보여주는 간단한 창입니다. 변경된 경우 창을 통해 보이는 내용도 변경됩니다. 이 기능은 일부 상황에서 유용 할 수 있습니다 (예를 들어, 필요할 때마다 현재 키 목록을 다시 계산하는 대신 프로그램의 여러 부분에있는 키에 대한보기로 작업 할 수 있습니다) .- 사전 키가 수정 된 경우 뷰를 반복하면서 반복자가 어떻게 동작해야하는지 잘 정의되지 않아 오류가 발생할 수 있습니다.

    한 가지 장점은 키 목록을 만드는 것이 작고 고정 된 양의 메모리 만 사용하며 키 목록을 만들지 않기 때문에 작고 일정한 프로세서 시간이 필요하다는 것입니다 (반면에 Python 2, Rajendran T가 인용 한 것처럼 목록의 길이에 비례하여 메모리와 시간이 소요되는 새로운 목록을 불필요하게 만듭니다. 창 비유를 계속하려면 벽 뒤에있는 경치를보고 싶다면 간단히 창을여십시오 (창을 만듭니다). 키를 목록에 복사하는 것은 대신 벽에 경관의 사본을 그려주는 것과 같습니다. 복사에는 시간과 공간이 필요하며 자체를 업데이트하지 않습니다.

    요약하면,보기는 간단히 ... 사전의보기 (창)로, 사전이 변경된 후에도 내용을 보여줍니다. 그들은 목록의 기능과 다른 기능을 제공합니다. 키의 목록에는 특정 시점의 사전 키 사본이 들어 있지만보기는 동적이며 어떤 데이터도 복사 할 필요가 없기 때문에 훨씬 빨리 얻을 수 있습니다 ( 키 또는 값)을 생성 할 수 있습니다.

  2. ==============================

    2.당신이 dict.items () 언급했듯이 낭비이며 dict.iteritems () 사전 (키, 값) 쌍의 반복자를 반환합니다 사전의 목록 (키, 값) 쌍의 복사본을 반환합니다.

    당신이 dict.items () 언급했듯이 낭비이며 dict.iteritems () 사전 (키, 값) 쌍의 반복자를 반환합니다 사전의 목록 (키, 값) 쌍의 복사본을 반환합니다.

    이제 다음 예제를 통해 dict의 반복자와 dict의 뷰 사이의 차이점을 확인하십시오.

    >>> 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
    

    보기가 단순히 dict에있는 것을 보여주는 반면. 그것은 그것이 바뀌어도 상관하지 않습니다 :

    >>> 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 ()가 오류를 발생 시켰습니다.

  3. ==============================

    3.문서를 읽는 것에서부터 나는이 느낌을 얻었다.

    문서를 읽는 것에서부터 나는이 느낌을 얻었다.

    그래서 당신이 사전을 유지하고 그 사이에 반복하여 키 / 항목 / 값을 반복적으로 반복하는 경우 키 사용법을 추측합니다. mydict.iteritems ()에서 k, v를 돌리는 대신 뷰를 사용할 수 있습니다. k : into, myview : v. 그러나 사전을 한 번 반복한다면 한 번 더이 버전을 사용할 수 있습니다.

  4. ==============================

    4.뷰 메서드는 .keys (), .items () 및 .values ​​()와 비교하여 목록의 복사본이 아닌 목록을 반환하므로보다 가볍지 만 사전의 현재 내용을 반영합니다.

    뷰 메서드는 .keys (), .items () 및 .values ​​()와 비교하여 목록의 복사본이 아닌 목록을 반환하므로보다 가볍지 만 사전의 현재 내용을 반영합니다.

    파이썬 3.0에서 - dict 메소드는 뷰를 리턴한다 - 왜?

  5. ==============================

    5.뷰를 사용하면 복사하지 않고 밑받침 데이터 구조에 액세스 할 수 있습니다. 목록을 만드는 것과는 달리 동적 인 것 외에 가장 유용한 용도 중 하나는 테스트입니다. 값이 dict에 있는지 여부 (키 또는 값)를 확인하려고한다고 가정 해보십시오.

    뷰를 사용하면 복사하지 않고 밑받침 데이터 구조에 액세스 할 수 있습니다. 목록을 만드는 것과는 달리 동적 인 것 외에 가장 유용한 용도 중 하나는 테스트입니다. 값이 dict에 있는지 여부 (키 또는 값)를 확인하려고한다고 가정 해보십시오.

    옵션 하나는 dict.keys ()를 사용하여 키 목록을 만드는 것입니다.하지만이 작업은 분명히 더 많은 메모리를 소비합니다. dict이 매우 큰 경우? 그것은 낭비 일 것입니다.

    뷰를 사용하면 중간 목록없이 실제 데이터 구조를 반복 할 수 있습니다.

    예제를 사용합시다. 임의의 문자열과 숫자로 이루어진 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?
    

    보시다시피 뷰 객체를 반복하면 성능이 크게 향상되어 동시에 메모리 오버 헤드가 줄어 듭니다. Set like operations을 수행해야 할 때 사용해야합니다.

    참고 : 저는 Python 2.7에서 실행하고 있습니다.

  6. from https://stackoverflow.com/questions/8957750/what-are-dictionary-view-objects by cc-by-sa and MIT license