random.SystemRandom().randint() inefficient

MRAB python at mrabarnett.plus.com
Wed Jul 27 14:55:26 EDT 2022


On 27/07/2022 18:24, Cecil Westerhof via Python-list wrote:
> MRAB <python at mrabarnett.plus.com> writes:
> 
>> On 27/07/2022 16:43, Cecil Westerhof via Python-list wrote:
>>> "Michael F. Stemper" <michael.stemper at gmail.com> writes:
>>> 
>>>> This is orthogonal to your question, but might be of some use to you:
>>>>
>>>> The combination of using len(to_try) as an argument to randint() and
>>>> saving the output to a variable named "index" suggests that you might
>>>> be setting up to select a random element from to_try, as in:
>>>>   something = to_try[index]
>>>>
>>>> If that is the case, you might want to consider using random.choice() instead:
>>>>
>>>>   >>> from random import choice
>>>>   >>> to_try = [2,3,5,7,11,13,"seventeen",19]
>>>>   >>> choice(to_try)
>>>>   2
>>>>   >>> choice(to_try)
>>>>   'seventeen'
>>>>   >>> choice(to_try)
>>>>   13
>>>>   >>> choice(to_try)
>>>>   5
>>>>   >>>
>>> Yes, I try to select a random element, but it has also to be removed,
>>> because an element should not be used more as once.
>>> This is the code I use:
>>>      # index = randbelow(len(to_try))
>>>      index = randrange(len(to_try))
>>>      found = permutation[to_try.pop(index)]
>>> 
>>
>> When you pop an element from the last, the elements after it need to be
>> moved down, which takes time.
>>
>> Try shuffling the list and then popping the now randomly-ordered
>> elements off the end.
> 
> Would shuffling not be a lot more expensive? Especially because I do
> not eat the whole list.
> 
You won't know until you time it.


More information about the Python-list mailing list