on a very slow function

Christian Gollwitzer auriocus at gmx.de
Mon Oct 2 01:19:14 EDT 2017


Am 01.10.17 um 23:27 schrieb Daniel Bastos:
> def make_sequence_non_recursive(N, x0 = 2, c = -1):
>    "What's wrong with this function?  It's very slow."
>    last = x0
>    def sequence():
>      nonlocal last
>      next = last
>      last = last**2 + c
>      return next % N
>    return sequence
> 
> It crawls pretty soon.  Please advise?  Thank you.

You seem to do modular arithmetics with modulus N. You can take the 
modulus after each single operation. This line:

	last = last**2 + c

will quadratically grow the internal state of the generator. Instead, 
you should write

	last = (last**2 + c) % N

If I have understood what it does, then the result should be the same. 
Furthermore, as Chris said, Python has built-in generators for this thing.

	Christian



More information about the Python-list mailing list