pythonize this!

Stefan Behnel stefan_ml at behnel.de
Tue Jun 15 09:01:59 EDT 2010


Stefan Behnel, 15.06.2010 14:23:
> superpollo, 15.06.2010 13:49:
>> goal (from e.c.m.): evaluate
>> 1^2+2^2+3^2-4^2-5^2+6^2+7^2+8^2-9^2-10^2+...-2010^2, where each three
>> consecutive + must be followed by two - (^ meaning ** in this context)
>>
>> my solution:
>>
>> >>> s = 0
>> >>> for i in range(1, 2011):
>> ... s += i**2
>> ... if not (i+1)%5:
>> ... s -= 2*i**2
>> ... if not i%5:
>> ... s -= 2*i**2
>
> Pretty ugly, if you ask me. What about this:
>
> s = 0
> for i in range(1, 2011):
>     if i%5 in (1,2,3):
>         s += i**2
>     else:
>         s -= i**2
>
> Here's the obvious one-liner:
>
> s = sum(i**2 if i%5 in (1,2,3) else -i**2
>     for i in range(1, 2011))
>
> Runs in ~600 usecs for me according to timeit - pretty fast.

Just for the record, this Cython code runs in ~15 usecs for me:

     def makesum():
         return <int>sum(i**2 if i%5 in (1,2,3) else -i**2
                         for i in range(1, 2011))

using the latest Cython 0.13pre. The "<int>" cast is required to drop the 
sum() into efficient C code. Without it, the code runs in 55 usecs.

Stefan




More information about the Python-list mailing list