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。