Ответы:
Ответ Адама довольно быстрый, но я обнаружил, что random.getrandbits(1)
он намного быстрее. Если вы действительно хотите логическое вместо длинного, то
bool(random.getrandbits(1))
все еще примерно в два раза быстрее random.choice([True, False])
Оба решения должны import random
Если максимальная скорость не является приоритетом, то, random.choice
безусловно, читается лучше
$ 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
Добавил этот, увидев ответ @ Павла
$ 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
избегая поиска атрибутов. :-)
random.choice([True, False])
также будет работать.
Нашел более быстрый метод:
$ 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
уже оценивается как бул, который еще быстрее!
random() >= 0.5
в противном случае вы будете слегка склонны к Ложному.
random() < 0.5
имеет больше смысла, так как изменение 0.5 на некоторую другую вероятность работает, как и ожидалось
Если вы хотите сгенерировать несколько случайных логических значений, вы можете использовать случайный модуль numpy. Из документации
np.random.randint(2, size=10)
вернет 10 случайных одинаковых целых чисел в открытом интервале [0,2). В size
ключевом слове определяет число значений для генерации.
Мне было любопытно, как скорость откровенного ответа шла против других ответов, так как это было исключено из сравнений. Чтобы сгенерировать один случайный бул, это намного медленнее, но если вы хотите сгенерировать много, то это станет намного быстрее
$ 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
Вы можете использовать библиотеку Faker , она в основном используется для тестирования, но способна предоставлять множество поддельных данных.
Установите: https://pypi.org/project/Faker/
>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True
Новый подход к этому вопросу будет связан с использованием Faker, который вы можете легко установить 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()
Синтаксис является чистым и легким для других обращали внимание.
not not random.getrandbits(1))
быстрее, чемbool
;)