Get a random boolean in python?
Adam's answer is quite fast, but I found that random.getrandbits(1)
to be quite a lot faster. If you really want a boolean instead of a long then
bool(random.getrandbits(1))
is still about twice as fast as random.choice([True, False])
Both solutions need to import random
If utmost speed isn't to priority then random.choice
definitely reads better.
Note that random.choice()
is slower than just choice()
(after from random import choice
) due to the attribute lookup.
$ python3 --versionPython 3.9.7$ python3 -m timeit -s "from random import choice" "choice([True, False])"1000000 loops, best of 5: 376 nsec per loop$ python3 -m timeit -s "from random import choice" "choice((True, False))"1000000 loops, best of 5: 352 nsec per loop$ python3 -m timeit -s "from random import getrandbits" "getrandbits(1)"10000000 loops, best of 5: 33.7 nsec per loop$ python3 -m timeit -s "from random import getrandbits" "bool(getrandbits(1))"5000000 loops, best of 5: 89.5 nsec per loop$ python3 -m timeit -s "from random import getrandbits" "not getrandbits(1)"5000000 loops, best of 5: 46.3 nsec per loop$ python3 -m timeit -s "from random import random" "random() < 0.5"5000000 loops, best of 5: 46.4 nsec per loop
Found a faster method:
$ python -m timeit -s "from random import getrandbits" "not getrandbits(1)"10000000 loops, best of 3: 0.222 usec per loop$ python -m timeit -s "from random import random" "True if random() > 0.5 else False"10000000 loops, best of 3: 0.0786 usec per loop$ python -m timeit -s "from random import random" "random() < 0.5"10000000 loops, best of 3: 0.0579 usec per loop