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