Help- Recursion v. Iter Speed comparison
Robert Kern
rkern at ucsd.edu
Wed Mar 2 04:44:30 EST 2005
actuary77 wrote:
> #================================================
> # non-generator
> #================================================
>
>
> def f1(afunc,aseed,n):
> values = [afunc(aseed)]
> for i in range(n-1):
> values.append(afunc(values[-1]))
> return values[-1]
>
> _b=time()
> for _i in range(0,100):
> _y = f1(myfunc,seed,n)
Why do you do this? The whole point of this approach was to keep the
intermediate results instead of recomputing them every time!
And why do you prepend underscores everywhere? It's bad Python style.
> _e=time()
> _t=_e-_b
>
> print "f1 result: %r time: %f\n" % (_y,_t*10000.)
>
>
> #================================================
> # generator
> #================================================
>
> def f2(afunc,aseed,n):
> v = myfunc(aseed)
> print v
> for i in range(n):
> yield v
> v = afunc(v)
>
> def f2gen(i):
> for _i in range(1,n-1):
> f2(myfunc,seed,n)
> return f2(myfunc,seed,n)
> _b=time()
> for _i in range(0,cnt):
> _y = f2gen(_i)
> _e=time()
> _t=_e-_b
> print "f2gen result: %r time: %f\n" % (_y,_t*10000.)
>
>
> ==>
>
> rec result: 10.005049999999988 time: 47669.999599
>
> f1 result: 10.004999999999988 time: 399.999619
>
> f2gen result: <generator object at 0x008D74E0> time: 30739.998817
>
> I don't know how to get the generator to work correcly, I understand
> that the yield preserves the state of the funcion every time it is
> called. So in order to have myfunc called 50 times, the generator must
> be called 50 times, but it refuses to return a value. PEP 255 isn't
> helping me.
No, the generator call creates a generator object which you iterate over.
for value in f2(myfunc, seed, n):
print value
If you absolutely need a list:
list(f2(myfunc, seed, n))
--
Robert Kern
rkern at ucsd.edu
"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter
More information about the Python-list
mailing list