假设我有一个列表:
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:我的案例中的列表包含更多内存密集的项目,这就是为什么我想尽可能优化的原因。
答案 0 :(得分:7)
不使用上述任何一项。使用sum()
和生成器表达式:
sum(i % 2 == 0 for i in mylist)
在Python中,bool
布尔类型是int
的子类,True
的整数值为1
,False
具有0
},因此您可以对一系列True
和False
结果进行求和。
sum()
- with-generator表达式只需要一次在内存中保留一个布尔值,不必生成中间列表,只保留计算长度。
或者,坚持过滤并总结1
文字:
sum(1 for i in mylist if i % 2 == 0)
这样可以减少需要添加的对象。