Setup overhead seems to be higher. Here are some times in seconds for 2**25 / n
times summing [1] * n
with three methods (so for every n and thus every row, the total number of summed numbers is the same, namely 2**25
). Note how all three start slow and loop starts fastest. No idea why loop, after going below 2.0, goes up to 2.8 (edit: Maybe Python's small integers cache makes sums below 257 faster, but the other two solutions don't seem to suffer from that).
n loop generator pure
-----------------------------------
1 11.3239 24.6003 12.5587
2 6.8343 13.6080 5.6892
4 4.4053 7.9283 3.0991
8 3.2007 5.5467 1.8115
16 2.5485 3.7965 1.1166
32 2.2361 3.0682 0.7247
64 2.0101 3.0527 0.5513
128 2.0220 2.4149 0.4475
256 1.8081 2.3848 0.3966
512 2.0703 2.3418 0.4229
1024 2.2276 2.2966 0.3706
2048 2.2751 2.2856 0.3614
4096 2.2761 2.3269 0.3533
8192 2.3085 2.3623 0.3671
16384 2.3395 2.2970 0.3552
32768 2.4804 2.3583 0.4097
65536 2.5998 2.3151 0.3572
131072 2.7952 2.2654 0.3954
262144 2.7445 2.4830 0.3599
524288 2.7740 2.3462 0.3565
1048576 2.7449 2.2845 0.3592
2097152 2.8187 2.2246 0.3708
4194304 2.8307 2.2691 0.3572
8388608 2.8036 2.2731 0.3690
16777216 2.7704 2.3388 0.3649
33554432 2.8328 2.3018 0.3545
You have n ≤ 6, so my test agrees that generator is slower there. In my case it's more extreme, presumably because I'm not doing anything else like converting numbers to strings and looking up list indexes and summing large numbers.
Code:
from timeit import timeit
def sum_loop(numbers):
total = 0
for number in numbers:
total += number
return total
def sum_generator(numbers):
return sum(number for number in numbers)
def sum_pure(numbers):
return sum(numbers)
emax = 25
for e in range(emax + 1):
n = 2**e
number = 2**(emax - e)
numbers = [1] * n
print('%8d' % n, end='')
for f in sum_loop, sum_generator, sum_pure:
t = timeit(lambda: f(numbers), number=number)
print(' %7.4f' % t, end='')
print()