Python 使用生成器进行计数的最佳实践是什么

Python 使用生成器进行计数的最佳实践是什么,python,count,generator,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 从速度或记忆的角度来

假设我有一个列表,如:

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:在我的例子中,列表中有更多的内存密集项,这就是为什么我希望尽可能地进行优化。

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

sum(i % 2 == 0 for i in mylist)
在Python中,
bool
布尔类型是
int
的子类,
True
的整数值为
1
False
的值为
0
,因此可以对一系列
True
False
结果求和

带生成器表达式的
sum()
-每次只需在内存中保留一个布尔值,不必生成中间列表并保留以计算长度

或者,坚持筛选和求和
1
文字:

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

这导致需要加起来的对象更少。

@TessellatingHeckler:那些加起来了,不是吗?@TessellatingHeckler计算奇数是一个很好的例子来解释我的问题。事实上,我对用最快的方法来确定一个数字是否为偶数并不感兴趣。无论如何,谢谢。@TessellingEckler:但是,对于
i=2
,表达式
~(i&1)
产生-1,而对于
i=1
则得到
-2
。这真的会弄乱这里的结果,因为我们把它们加起来是-2和-1,而不是0或1。您必须使用
1-(i&1)
,或者将总和除以-2..@MartijnPieters eeeee,oops。和我一起回到绘图交互式解释器。在阅读了另一个问题后,看起来
sum(如果i%2==0,则mylist中的i为1)
稍微快一点(对于xrange(1000)在python 2.7中,布尔数之和为112 uS,过滤1之和为77 uS。建议:学习如何使用
timeit
并自己测量这些结果。如果使用IPython及其内置
%timeit
magic更容易…@Corleybridman感谢您的建议。我使用并喜欢%timeit。然而,他提出的问题是re主要是研究内存效率。我在寻找另一种方法来计算项目,而不生成列表本身。这是真的。另外,可能相关:……顺便说一句,既然你提到了生成器,那么你现在使用的是python 3?@CorleyBrigman nope.python 2.7 4eva。