查看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
。
答案 0 :(得分:1)
我猜自己,这只是一个被忽视的错误。似乎已经匆忙创建了Counter
类。
例如。 Counter
不包含许多就地方法,例如__iadd__
和__isub__
。
这使得连续使用效率低下
c = Counter()
for other in list_of_counters:
c += other
尽管如此,这些都是Python 3中添加的。似乎没有任何理由为什么它们本来不应该被实现,可能出于与此相同的原因。