on a very slow function

bartc bc at freeuk.com
Mon Oct 2 12:02:53 EDT 2017


On 02/10/2017 14:54, Peter Otten wrote:
> bartc wrote:
> 
>> On 02/10/2017 08:41, Peter Otten wrote:
>>> Daniel Bastos wrote:
>>>
>>>> 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
>>
>>>>>> x.bit_length()
>>> 12534884
>>>
>>> So at this point it alreay would take 1.5 MB to store the number in
>>> binary. The actual format requires even a bit more memory:
>>>
>>>>>> import sys
>>>>>> sys.getsizeof(x)
>>> 1671344
>>>
>>> So for every operation you have to touch a lot of memory -- and that
>>> takes time.
>>
>> If it recalculates 'last' once for each of those couple of dozen printed
>> lines, that I doubt accessing a few MB of memory is the issue. More
>> doing such a big calculation.
> 
> You are probably right that the calculation requires a significant amount of
> the total time here, but it's not just "a few MB". If you look at
> 
>>>>       last = last**2 + c
> 
> the required memory doubles on every iteration. You will soon run into the
> problem even under the (overly optimistic) assumption that the calculation
> requires time proportional to memory.

On my machine, the iterations whizzed up the screen until I noticed it 
pausing on the 21st iteration, when the memory size of last was 0.5MB.

When I started last as "A", and multiplied by 2 at each step, it started 
to pause at the 27th iteration when the size of last was 268MB.

I would estimate then another 9 steps of the original (30th iteration) 
before memory usage has the same effect. Although it would probably 
already have ground to a halt long before then.

-- 
bartc



More information about the Python-list mailing list