使用生成器进行计数的最佳做法是什么
What is best practice to use generators for counting purposes
假设我有一个这样的列表:
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:在我的例子中,列表有更多的内存密集型项目,这就是为什么我想尽可能优化的原因。
使用上面的none。使用 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)
这导致需要添加的对象更少。
假设我有一个这样的列表:
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:在我的例子中,列表有更多的内存密集型项目,这就是为什么我想尽可能优化的原因。
使用上面的none。使用 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)
这导致需要添加的对象更少。