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
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.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()返回一个dictionary-itemiterator。
作为一个列表,d.s 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.t 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!
所以物品本身是一样的——运送物品的容器是不同的。一个是列表,另一个是迭代器(取决于Python版本…)
因此,dict.items()和dict.iteritems()之间的适用差异与列表和迭代器之间的适用差异相同。