Я работал над теорией о том, что генераторные выражения имеют тенденцию быть более эффективными, чем обычные циклы. Но затем я столкнулся с следующим примером: напишите функцию, которая задала число, 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
4x медленнее даже близко! Зачем? Что я не понимаю?