Python2에서 dict.items ()와 dict.iteritems ()의 차이점은 무엇입니까? 적용 가능한 차이점이

dict.items()와 사이에 적용 가능한 차이점이 dict.iteritems()있습니까?

로부터 파이썬 문서 :

dict.items(): 사전 (키, 값) 쌍의 사전 사본 을 리턴합니다 .

dict.iteritems(): 사전 (키, 값) 쌍에 대해 반복자 를 리턴합니다 .

아래 코드를 실행하면 각각 동일한 객체에 대한 참조를 반환하는 것으로 보입니다. 내가 놓친 미묘한 차이점이 있습니까?

#!/usr/bin/python

d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
   if d[k] is v: print '\tthey are the same object'
   else: print '\tthey are different'

print 'd.iteritems():'
for k,v in d.iteritems():
   if d[k] is v: print '\tthey are the same object'
   else: print '\tthey are different'   

산출:

d.items():
    they are the same object
    they are the same object
    they are the same object
d.iteritems():
    they are the same object
    they are the same object
    they are the same object



답변

그것은 진화의 일부입니다.

원래 Python items()은 실제 튜플 목록을 작성하여 반환했습니다. 잠재적으로 많은 추가 메모리가 필요할 수 있습니다.

그런 다음 생성기를 일반적으로 언어에 도입하고 해당 메소드를라는 이름의 반복자 생성기 메소드로 다시 구현했습니다 iteritems(). 이전 버전과의 호환성을 위해 원본이 남아 있습니다.

Python 3의 변경 사항 중 하나는 items()이제 반복자를 반환하며 목록이 완전히 작성되지 않는다는 것입니다. iteritems()방법은 또한 이후, 사라 items()세 작품처럼 파이썬으로 viewitems()파이썬 2.7.


답변

dict.items()2 튜플 ( [(key, value), (key, value), ...]) 목록을 반환하는 반면 dict.iteritems()2 튜플을 생성하는 생성기입니다. 전자는 처음에는 더 많은 공간과 시간이 필요하지만 각 요소에 액세스하는 것은 빠르지 만 두 번째는 처음에는 더 적은 공간과 시간이 걸리지 만 각 요소를 생성하는 데 약간의 시간이 더 걸립니다.


답변

Py2.x에서

명령은 dict.items(), dict.keys()dict.values()반환 사본 사전의의 목록(k, v)쌍, 키와 값을. 복사 된 목록이 매우 큰 경우 많은 메모리가 필요할 수 있습니다.

명령 dict.iteritems(), dict.iterkeys()dict.itervalues()반환 반복자 사전의 이상 (k, v)쌍, 키와 값을.

명령 dict.viewitems(), dict.viewkeys()dict.viewvalues()반환 뷰 객체 사전의 변경 사항을 반영 할 수 있습니다. (즉 , 사전에 del항목을 추가하거나 (k,v)쌍을 추가 하면 뷰 객체가 자동으로 동시에 변경 될 수 있습니다 .)

$ python2.7

>>> d = {'one':1, 'two':2}
>>> type(d.items())
<type 'list'>
>>> type(d.keys())
<type 'list'>
>>>
>>>
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>
>>> type(d.iterkeys())
<type 'dictionary-keyiterator'>
>>>
>>>
>>> type(d.viewitems())
<type 'dict_items'>
>>> type(d.viewkeys())
<type 'dict_keys'>

Py3.x에있는 동안

Py3.x에서 물건에만 있기 때문에, 더 깨끗하고 dict.items(), dict.keys()그리고 dict.values()반환되는 사용 가능한 뷰 객체를 그대로 dict.viewitems()Py2.x했던있다.

그러나

@lvc가 언급 한 것처럼, 뷰 객체는 동일하지 않습니다 반복자 당신이 반환하려는 경우 그래서, 반복자 Py3.x의를, 당신은 사용할 수 있습니다 iter(dictview):

$ python3.3

>>> d = {'one':'1', 'two':'2'}
>>> type(d.items())
<class 'dict_items'>
>>>
>>> type(d.keys())
<class 'dict_keys'>
>>>
>>>
>>> ii = iter(d.items())
>>> type(ii)
<class 'dict_itemiterator'>
>>>
>>> ik = iter(d.keys())
>>> type(ik)
<class 'dict_keyiterator'>


답변

‘dict.items ()와 dict.iteritems () 사이에 적용 가능한 차이점이 있습니까?’

이것은 도움이 될 수 있습니다 (Python 2.x의 경우).

>>> d={1:'one',2:'two',3:'three'}
>>> type(d.items())
<type 'list'>
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>

d.items()키, 값 쌍의 튜플 목록을 d.iteritems()반환하고 사전 반복자 를 반환하는 것을 볼 수 있습니다 .

목록으로 d.items ()는 슬라이스 가능합니다.

>>> l1=d.items()[0]
>>> l1
(1, 'one')   # an unordered value!

그러나 __iter__방법 이 없습니다 .

>>> next(d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator

반복자로서 d.iteritems ()는 슬라이스 할 수 없습니다 :

>>> i1=d.iteritems()[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dictionary-itemiterator' object is not subscriptable

그러나 가지고있다 __iter__:

>>> next(d.iteritems())
(1, 'one')               # an unordered value!

따라서 품목 자체는 동일합니다. 품목을 운반하는 컨테이너가 다릅니다. 하나는리스트이고 다른 하나는 파이썬 버전에 따라 반복자입니다.

따라서 dict.items ()와 dict.iteritems ()의 적용 가능한 차이점은 목록과 반복자의 적용 가능한 차이점과 동일합니다.


답변

dict.items()튜플 목록을 반환하고 튜플의 dict.iteritems()반복자 객체를로 사전에 반환합니다 (key,value). 튜플은 동일하지만 컨테이너는 다릅니다.

dict.items()기본적으로 모든 사전을 목록으로 복사합니다. dict.items()및 의 실행 시간을 비교하려면 다음 코드를 사용하십시오 dict.iteritems(). 차이점을 볼 수 있습니다.

import timeit

d = {i:i*2 for i in xrange(10000000)}
start = timeit.default_timer() #more memory intensive
for key,value in d.items():
    tmp = key + value #do something like print
t1 = timeit.default_timer() - start

start = timeit.default_timer()
for key,value in d.iteritems(): #less memory intensive
    tmp = key + value
t2 = timeit.default_timer() - start

내 컴퓨터의 출력 :

Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186

이것은 dictionary.iteritems()훨씬 더 효율적 임을 보여줍니다 .


답변

당신이 가지고 있다면

dict = {key1:value1, key2:value2, key3:value3,...}

에서 파이썬 2 , dict.items()사본 각 튜플 반환 사전 예에서 튜플의 목록을 [(key1,value1), (key2,value2), ...]. 전체 사전이 튜플을 포함하는 새 목록으로 복사된다는 의미입니다.

dict = {i: i * 2 for i in xrange(10000000)}
# Slow and memory hungry.
for key, value in dict.items():
    print(key,":",value)

dict.iteritems()사전 항목 반복자를 반환합니다. 반환 된 항목의 값도 동일 (key1,value1), (key2,value2), ...하지만 이는 목록이 아닙니다. 이것은 사전 항목 반복자 오브젝트 일뿐입니다. 이는 메모리 사용량이 적다는 것을 의미합니다 (50 % 감소).

  • 변경 가능한 스냅 샷으로 나열합니다. d.items() -> list(d.items())
  • 반복자 객체 : d.iteritems() -> iter(d.items())

튜플은 동일합니다. 튜플을 각각 비교하여 동일하게 만듭니다.

dict = {i: i * 2 for i in xrange(10000000)}
# More memory efficient.
for key, value in dict.iteritems():
    print(key,":",value)

에서 파이썬 3 , dict.items()반환 객체를 반복자. dict.iteritems ()가 제거되어 더 이상 문제가 없습니다.


답변

dict.iteritemsPython3.x에서 사라 졌으므로 iter(dict.items())동일한 출력 및 메모리 할당을 얻는 데 사용 하십시오.