On Wed, 27 Jul 2022 at 06:06, Cecil Westerhof via Python-list <python-list@python.org> wrote: > > Chris Angelico <ros...@gmail.com> writes: > > > On Wed, 27 Jul 2022 at 01:06, Cecil Westerhof via Python-list > > <python-list@python.org> wrote: > >> > >> I need to get a random integer. At first I tried it with: > >> from secrets import randbelow > >> index = randbelow(len(to_try)) > >> > >> This works perfectly, but it took some time. So I thought I try: > >> from random import SystemRandom > >> index = SystemRandom().randint(0, len(to_try) - 1) > >> > >> A first indication is that the second version would take about two > >> times as much time as the first. Is there a reason for this, or should > >> this not be happening? > >> > > > > You're setting up a brand new SystemRandom instance just for a single > > random number. For a fairer comparison, set up the instance, then > > generate far more than just a single number, and see how that goes. > > Thanks. I thought I did something wrong and I did. > I will try to implement like you said and look what the result will > be. (And share it.)
Thanks! Don't feel bad; performance testing is *hard*, getting meaningful results takes a lot of of fiddling with parameters, and getting interesting AND meaningful results can sometimes seem about impossible. > (As I understand it both do more, or less the same and should have > comparable performance.) In normal production work? Yes (the SystemRandom object doesn't have any significant state - a seeded RNG could have a lot more overhead here). But for performance testing? The work of instantiating the class could be completely irrelevant, or it could be dominating your results. It's hard to say, hence the suggestion to try it without reinstantiating. ChrisA -- https://mail.python.org/mailman/listinfo/python-list