我想计算域内偶数的总和.我有两个解决方案,但我不确定每个解决方案的优点/缺点.哪种解决方案最佳?
import sys
domain = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Cal1 = sum(filter(lambda n : n % 2 == 0, domain))
Cal2 = sum([n for n in domain if n % 2 == 0])
sys.stdout.write("Cal1 = {0}\n".format(Cal1))
sys.stdout.write("Cal2 = {0}\n".format(Cal2))
Run Code Online (Sandbox Code Playgroud)
Amb*_*ber 13
第二个真的应该只是一个生成器,而不是列表理解(因为你实际上不需要创建一个列表来能够对生成器的输出求和):
Cal2 = sum(n for n in domain if n % 2 == 0)
Run Code Online (Sandbox Code Playgroud)
这是完成此任务的现在首选("pythonic")方式.
使用列表推导(包括[]原始的列表解析Cal2)是不利的,因为它实际上构造了一个要返回的列表对象,这会产生开销.
使用filter(你的Cal1)相当于一个生成器(无[]版本),但需要更多的输入,并且不能只使用生成器表达式(我上面发布的代码).
以下是旧版Mac笔记本电脑上各种版本的速度:
$ py26 -mtimeit -s'domain = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]' 'sum(filter(lambda n : n % 2 == 0, domain))'
100000 loops, best of 3: 4.41 usec per loop
$ py26 -mtimeit -s'domain = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]' 'sum([n for n in domain if n % 2 == 0])'
100000 loops, best of 3: 2.69 usec per loop
$ py26 -mtimeit -s'domain = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]' 'sum(n for n in domain if n % 2 == 0)'
100000 loops, best of 3: 2.86 usec per loop
Run Code Online (Sandbox Code Playgroud)
需要注意的是,虽然genexp版本无疑更冷静,在listcomp 是稍快(可能没有足够的理由担心,除非这个代码是你一直致力于优化鼻涕出来的;-)紧内循环.像往常一样,lambda基于其他人提到的基于版本的版本要慢得多 - lambda在Python中是一种"糟糕的关系":-(.((并非在某种情况下,def这里的功能会明显更好))