2

查看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)

但是使用了 in__add__和其他带有Counters 的.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在每种情况下都使用。

4

1 回答 1

1

我会猜测自己这只是一个未被注意到的错误。这个Counter类似乎是匆忙创建的。

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

这使得持续使用效率低下

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

尽管如此,这些都是在Python 3中添加的。似乎没有任何理由不应该最初实施它们,可能出于与此相同的原因。

于 2013-06-16T00:30:10.137 回答