我一直遵循这样的理论,即生成器表达式比普通循环更高效。但是,我遇到了以下例子:编写一个函数,该函数给定一个数字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倍慢甚至不接近!为什么?我误解了什么吗?