on a very slow function

Steve D'Aprano steve+python at pearwood.info
Sun Oct 1 20:34:24 EDT 2017


On Mon, 2 Oct 2017 09:49 am, Ben Bacarisse wrote:

> Daniel Bastos <dbastos at toledo.com> writes:
> 
>> 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?
> 
> A mathematical rather than Python answer... 


Which is the best sort of answer. When possible, simplifying your algorithm is
better than speeding up your code.

> change it to 
> 
>       last = (last**2 + c) % N
>       return next

Better:

last = (pow(last, 2, N) + (2 % N)) % N

will almost certainly be faster for large values of last.



-- 
Steve
“Cheer up,” they said, “things could be worse.” So I cheered up, and sure
enough, things got worse.




More information about the Python-list mailing list