Speeding up a script -- looking for ideas
Jeff Epler
jepler at unpythonic.net
Sun Oct 20 15:44:38 CEST 2002
On Sun, Oct 20, 2002 at 01:24:12AM -0700, Richard Bow wrote:
> I'm hoping to get some hints for significantly speeding up the below
> script.
IMO this program is the kind of inner loop that should be written in C
(or another typed language with no overhead on arithmetic) for efficiency.
My earlier algorithm (the one that doesn't loop on 'b'):
My program on my system, no psyco:
(13832, [(2, 24), (18, 20)])
1
real 0m1.645s
The same algorithm, implemented in C:
13832 (2 24) (18 20)
real 0m0.101s
psyco gets you closer (probably), but it still doesn't offer a factor of 16.
I'll admit that the "cubert" function makes me a bit uneasy (as its
corresponding part did in the python version) but it's a small matter of
making that function correct for all integer values...
#include <math.h>
#include <stdio.h>
#define N 2
unsigned cubert(unsigned int u) {
return (unsigned)(pow(u, 1./3.)+.5);
}
unsigned f(unsigned low, unsigned high) {
unsigned pairs[N][2];
unsigned n, a, b, c, cu;
for(c=low; c<high; c++) {
n = 0;
cu = cubert(c)+2;
for(a=1; a<cu; a++) {
b = cubert(c-a*a*a);
if (b < a) break;
if (a*a*a+b*b*b == c) {
pairs[n][0] = a;
pairs[n][1] = b;
n++;
if(n == N) {
printf("%u", c);
for(n=0; n<N; n++) {
printf(" (%u %u)", pairs[n][0], pairs[n][1]);
}
printf("\n");
break;
}
}
}
}
}
int main(int argc, char **argv) {
f(10000, 20000);
//f(1729, 1730);
}
More information about the Python-list
mailing list