random.SystemRandom().randint() inefficient

Cecil Westerhof Cecil at decebal.nl
Wed Jul 27 15:14:29 EDT 2022


Alan Bawden <alan at csail.mit.edu> writes:

> Cecil Westerhof <Cecil at decebal.nl> writes:
>
>    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.
>
> Instead of using pop to do that why not something like:
>
>     def lazy_shuffle(seq):
>         """
>         Generate the elements of the given sequence in a random order.
>         """
>         # Delete the next line if you want to use a different version of
>         # randrange:
>         from random import randrange
>         # Delete the next line if SEQ is already a mutable sequence and you
>         # are willing to have it destroyed by this process:
>         seq = list(seq)
>         n = len(seq)
>         while n:
>             i = randrange(n)
>             yield seq[i]
>             n -= 1
>             if i < n:
>                 seq[i] = seq[n]

That looks interesting.
But there is on problem. (I think.)
The list is only partly eaten and I will eat a lot of sequences. So a
lot of sequences will be left in the runtime.
Or is there a way to destroy the lazy_shuffle when it is not needed
anymore?

-- 
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof


More information about the Python-list mailing list