在 Python 中的大多数情况下,列表理解都经过了非常好的优化,我通常会使用它们。但今天我决定比较各种方法在筛选列表以仅保留偶数的简单任务中的性能:
from timeit import timeit
a = [*range(100)]
# just a basic for-loop
for_loop = """
res = []
for num in a:
if num % 2 == 0:
res.append(num)
"""
# list comprehension
list_comp = """
[num for num in a if num % 2 == 0]
"""
# generator
gen = """
def filter_even(data):
for i in data:
if i % 2 == 0: yield i
list(filter_even(a))
"""
# filter with lambda
filt = "list(filter(lambda x: x % 2 == 0, a))"
正如预期的那样,filter/lambda 最后完成,但令我惊讶的是生成器比列表理解或 for-loop 更快”
timeit(for_loop, globals=globals(), number=1000) / 1000 # 1.2194700000009106e-05
timeit(list_comp, globals=globals(), number=1000) / 1000 # 9.493400000110341e-06
timeit(gen, globals=globals(), number=1000) / 1000 # 7.859600000074351e-06
timeit(filt, globals=globals(), number=1000) / 1000 # 4.0766699999949195e-05
我不明白为什么生成器比列表推导式更快。这是大多数情况下的正常行为还是一次性情况?