[Tutor] List comprehension question

Richard D. Moores rdmoores at gmail.com
Tue Nov 9 06:31:37 CET 2010


On Mon, Nov 8, 2010 at 03:43, Steven D'Aprano <steve at pearwood.info> wrote:
> Richard D. Moores wrote:

> Coming back to your function:
>
> def proper_divisors(n):
>    sum_ = 0
>    for x in range(1,n):
>        if n % x == 0:
>            sum_ += x
>    return sum_
>
>
> we can write that much more simply:
>
> def proper_divisors(n):
>    return sum(x for x in range(1, n) if n%x == 0)
>
>
> And we can speed it up a bit by realising that there's no need to go all the
> way up to n in the range. After all, we know that (say) 100%96 can't
> possibly be zero. The largest factor of n is sqrt(n):
>
>
> def proper_divisors(n):
>    return sum(x for x in range(1, int(math.sqrt(n))) if n%x == 0)
>
>
> For large n, that will save a lot of time.

That sqrt(n) works for speeding up the finding of primes, but here we
want to use int(n/2) (and why didn't I think of that?), which results
in about a 2x speedup. See <http://tutoree7.pastebin.com/dyRC8vuX>.

Dick


More information about the Tutor mailing list