dict.items()和dict.iteritems()之间有什么适用的区别吗?

来自Python文档:

dict.items():返回字典的(键,值)对列表的副本。 dict.iteritems():返回字典(key, value)对上的迭代器。

如果我运行下面的代码,每一个似乎都返回一个对相同对象的引用。有没有什么细微的差别是我没有注意到的?

#!/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()方法也消失了,因为Python 3中的items()工作方式类似于Python 2.7中的viewitems()。

其他回答

Dict.items()返回一个二元组列表([(key, value), (key, value),…]),而dict.iteritems()是一个生成二元组的生成器。前者最初需要更多的空间和时间,但访问每个元素都很快,而后者最初需要更少的空间和时间,但生成每个元素需要更多的时间。

python 2中的Dict.iteritems()等价于python 3中的dict.items()。

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.iteritems():提供一个迭代器。可以在循环之外的其他模式中使用迭代器。

student = {"name": "Daniel", "student_id": 2222}

for key,value in student.items():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

for key,value in student.iteritems():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

studentIterator = student.iteritems()

print(studentIterator.next())
('student_id', 2222)

print(studentIterator.next())
('name', 'Daniel')

这是进化的一部分。

最初,Python items()构建了一个真正的元组列表并返回该列表。这可能会占用大量额外的内存。

然后,将生成器引入到语言中,并将该方法重新实现为名为iteritems()的迭代器生成器方法。保留原始版本用于向后兼容。

Python 3的一个变化是items()现在返回视图,列表永远不会完全构建。iteritems()方法也消失了,因为Python 3中的items()工作方式类似于Python 2.7中的viewitems()。