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

Sai*_*ait 0 python generator count

假设我有一个列表:

my_list = range(10)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

counter = 0
for item in my_list:
   if item % 2 == 0:
      counter += 1
Run Code Online (Sandbox Code Playgroud)

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

PS:我的案例中的列表有更多内存繁重的项目,这就是为什么我想要尽可能优化.

Mar*_*ers 7

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

sum(i % 2 == 0 for i in mylist)
Run Code Online (Sandbox Code Playgroud)

在Python中,bool布尔类型是其子类,int并且True具有整数值1,Falsehas 0,因此您可以对一系列TrueFalse结果求和.

所述sum()-with发电机表达只需要在存储器中保持一个布尔的时间,没有中介列表已经被产生并保持在大约只是计算的长度.

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

sum(1 for i in mylist if i % 2 == 0)
Run Code Online (Sandbox Code Playgroud)

这导致需要添加的对象更少.