私は、ジェネレーター式は通常のループよりも効率的である傾向があるという理論に基づいて操作してきました。しかし、次の例に出くわしました。数値N
といくつかの因数を指定して、少なくとも 1 つの因数の倍数である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))
おそらく理解バージョンの方が少し速いかもしれませんが、2つのパフォーマンスはほぼ同じであると期待していましたが、私が期待していなかったのは次のとおりです。
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 倍遅くなるのも間近ではありません。なんで?私は何を誤解していますか?