使用生成器进行计数的最佳做法是什么

时间:2015-09-15 19:32:24

标签: python count generator

假设我有一个列表:

my_list = range(10)

我想知道列表中有多少偶数。请注意,我对这些值不感兴趣,我只想要它们的数量。所以我可以:

len( [0 for i in my_list if i % 2 == 0] ) # Method 1
len( [i for i in my_list if i % 2 == 0] ) # Method 2
len( [_ for i in my_list if i % 2 == 0] ) # Method 3

从速度或内存的角度来看,上述任何一种方法都比其他方法更好吗?

实际上我甚至不需要构建列表,但我不想:

counter = 0
for item in my_list:
   if item % 2 == 0:
      counter += 1

那么,哪一种是用发电机计数的好方法?

PS:我的案例中的列表包含更多内存密集的项目,这就是为什么我想尽可能优化的原因。

1 个答案:

答案 0 :(得分:7)

不使用上述任何一项。使用sum()和生成器表达式:

sum(i % 2 == 0 for i in mylist)

在Python中,bool布尔类型是int的子类,True的整数值为1False具有0 },因此您可以对一系列TrueFalse结果进行求和。

sum() - with-generator表达式只需要一次在内存中保留一个布尔值,不必生成中间列表,只保留计算长度。

或者,坚持过滤并总结1文字:

sum(1 for i in mylist if i % 2 == 0)

这样可以减少需要添加的对象。