Skip to main content
 首页 » 编程设计

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

2025年05月04日7小虾米

查看 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 的 .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。

请您参考如下方法:

我自己猜测这只是一个未引起注意的错误。 Counter 类似乎是仓促创建的。

例如。 Counter 不包含许多 inplace 方法,例如 __iadd__ 和 __isub__。

持续使用效率低下

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

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