【发布时间】:2015-11-29 16:16:21
【问题描述】:
我一直根据生成器表达式往往比普通循环更有效的理论进行操作。但后来我遇到了以下示例:编写一个函数,它给定一个数字 N 和一些因子 ps,返回 N 下所有数字的总和,这些数字是至少一个因子的倍数。
这是一个循环版本和一个较短的生成器表达式版本:
def loops(N, ps):
total_sum = 0
for i in xrange(N):
for p in ps:
if i%p == 0:
total_sum += i
break
return total_sum
def genexp(N, ps):
return sum(i for i in xrange(N)
if any(i%p == 0 for p in ps))
我希望两者的表现大致相同,也许理解版本会快一点,但我没想到的是:
for func in ('loops', 'genexp'):
print func, timeit.timeit('%s(100000, [3,5,7])' % func,
number=100,
setup='from __main__ import %s' % func)
loops 2.82878184319
genexp 10.1663100719
慢 4 倍还差得远!为什么?我误会了什么?
【问题讨论】:
-
你有生成器表达式,而不是列表推导式。
-
@MartijnPieters 谢谢!显然我不是蟒蛇人:)
标签: python performance python-2.7 generator generator-expression