这两个解决方案有什么区别 - lambda或loop - Python

kil*_*aik 7 python

我想计算域内偶数的总和.我有两个解决方案,但我不确定每个解决方案的优点/缺点.哪种解决方案最佳?

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)相当于一个生成器(无[]版本),但需要更多的输入,并且不能只使用生成器表达式(我上面发布的代码).


Ale*_*lli 7

以下是旧版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这里的功能会明显更好))