Python 2.7故意使用.items而不是.iteritems

时间:2013-06-16 00:14:20

标签: python dictionary counter

查看collections.py的来源我发现在某些情况下使用.items而不是.iteritems,我认为这是有意成为Python源代码的一部分。

例如。在update(已删除的评论)中,使用了.iteritems

 def update(self, iterable=None, **kwds):
   520 
   521         if iterable is not None:
   522             if isinstance(iterable, Mapping):
   523                 if self:
   524                     self_get = self.get
   525                     for elem, count in iterable.iteritems():
   526                         self[elem] = self_get(elem, 0) + count
   527                 else:
   528                     super(Counter, self).update(iterable) # fast path when counter is empty
   529             else:
   530                 self_get = self.get
   531                 for elem in iterable:
   532                     self[elem] = self_get(elem, 0) + 1
   533         if kwds:
   534             self.update(kwds)

但在__add__中使用了Counter s .items的其他操作

   590     def __add__(self, other):
   597         if not isinstance(other, Counter):
   598             return NotImplemented
   599         result = Counter()
   600         for elem, count in self.items():
   601             newcount = count + other[elem]
   602             if newcount > 0:
   603                 result[elem] = newcount
   604         for elem, count in other.items():
   605             if elem not in self and count > 0:
   606                 result[elem] = count
   607         return result

我理解使用.items小字典的情况会更快,但你不能相信它们总是很小,或者这是Python的猜测吗?我真的不明白为什么他们不会在每种情况下都使用.iteritems

1 个答案:

答案 0 :(得分:1)

我猜自己,这只是一个被忽视的错误。似乎已经匆忙创建了Counter类。

例如。 Counter不包含许多就地方法,例如__iadd____isub__

这使得连续使用效率低下

c = Counter()
for other in list_of_counters:
    c += other

尽管如此,这些都是Python 3中添加的。似乎没有任何理由为什么它们本来不应该被实现,可能出于与此相同的原因。