Respuestas:
La respuesta de Adam es bastante rápida, pero descubrí que random.getrandbits(1)
es bastante más rápida. Si realmente quieres un booleano en lugar de largo, entonces
bool(random.getrandbits(1))
sigue siendo aproximadamente el doble de rápido que random.choice([True, False])
Ambas soluciones necesitan import random
Si la máxima velocidad no es prioritaria, random.choice
definitivamente se lee mejor
$ python -m timeit -s "import random" "random.choice([True, False])"
1000000 loops, best of 3: 0.904 usec per loop
$ python -m timeit -s "import random" "random.choice((True, False))"
1000000 loops, best of 3: 0.846 usec per loop
$ python -m timeit -s "import random" "random.getrandbits(1)"
1000000 loops, best of 3: 0.286 usec per loop
$ python -m timeit -s "import random" "bool(random.getrandbits(1))"
1000000 loops, best of 3: 0.441 usec per loop
$ python -m timeit -s "import random" "not random.getrandbits(1)"
1000000 loops, best of 3: 0.308 usec per loop
$ python -m timeit -s "from random import getrandbits" "not getrandbits(1)"
1000000 loops, best of 3: 0.262 usec per loop # not takes about 20us of this
Agregó este después de ver la respuesta de @ Pavel
$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.115 usec per loop
from random import getrandbits
evitando la búsqueda de atributos. :-)
random.choice([True, False])
También funcionaría.
Encontró un método más rápido:
$ 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
random() > 0.5
¡ya se evalúa como un bool que es aún más rápido!
random() >= 0.5
, de lo contrario, estarás un poco sesgado hacia False.
random() < 0.5
tiene más sentido ya que cambiar 0.5 a alguna otra probabilidad funciona como se esperaba
Si desea generar un número de booleanos aleatorios, puede usar el módulo aleatorio de numpy. De la documentación
np.random.randint(2, size=10)
devolverá 10 enteros uniformes al azar en el intervalo abierto [0,2). La size
palabra clave especifica el número de valores a generar.
Tenía curiosidad acerca de cómo la velocidad de la respuesta entumecida se desempeñó en comparación con las otras respuestas, ya que esto se dejó fuera de las comparaciones. Para generar un bool aleatorio, esto es mucho más lento, pero si desea generar muchos, esto se vuelve mucho más rápido:
$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.0906 usec per loop
$ python -m timeit -s "import numpy as np" "np.random.randint(2, size=1)"
100000 loops, best of 3: 4.65 usec per loop
$ python -m timeit -s "from random import random" "test = [random() < 0.5 for i in range(1000000)]"
10 loops, best of 3: 118 msec per loop
$ python -m timeit -s "import numpy as np" "test = np.random.randint(2, size=1000000)"
100 loops, best of 3: 6.31 msec per loop
Puede usar la biblioteca Faker , se usa principalmente para pruebas, pero es capaz de proporcionar una variedad de datos falsos.
Instalar: https://pypi.org/project/Faker/
>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True
Una nueva versión de esta pregunta implicaría el uso de Faker con el que puede instalar fácilmente pip
.
from faker import Factory
#----------------------------------------------------------------------
def create_values(fake):
""""""
print fake.boolean(chance_of_getting_true=50) # True
print fake.random_int(min=0, max=1) # 1
if __name__ == "__main__":
fake = Factory.create()
create_values(fake)
fake.boolean()
sintaxis es limpia y fácil de asimilar para otros.
not not random.getrandbits(1))
es más rápido quebool
;)