我一直在使用generator的表達式比普通循環更有效。但後來我遇到了下面的例子:寫一個給定數字的函數,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謝謝!顯然,我不是一個蟒蛇人:) – Barry