# Speeding up a script -- looking for ideas

Jeff Epler jepler at unpythonic.net
Sun Oct 20 15:29:27 CEST 2002

```On Sun, Oct 20, 2002 at 10:57:54AM +0200, William wrote:
> without looking at your algorithme, it's typical think where psyco will
>
> without psyco :
>
> [(13832, 2, 24), (13832, 18, 20)]
>
> Time's up! 16.6103349924 seconds have elapsed
> EEEEEEEEEnnnnnnnnnnddddddddd

Well, looking at the algorithm, there's no reason to loop on values of c,
then loop on values of a, then loop on values of b.  Why not loop on c,
then on a, then find whether there's a value of b that will satisfy the
condition?

Your program on my system, no psyco:
Time's up! 6.24721693993 seconds have elapsed
My program on my system, no psyco:
(13832, [(2, 24), (18, 20)])
1
real    0m1.645s
(both on 10000-20000)

from __future__ import generators

r = range
def f(rr, n):
for c in rr:
l = []
for a in r(1, int(c**(1/3.0))+2):
a3 = a**3
if a3 > c: break
b = int((c - a**3)**(1./3)+.5)
if b < a: break
#print a, b, c
if a**3 + b**3 == c:
l.append((a, b))
if len(l) == n:
yield c, l
break

def main():
count = 0
for item in f(r(10000, 20000), 2):
count = count + 1
print item
print count

main()

```