Эффективный способ генерации и использования миллионов случайных чисел в Python

Я работаю над проектом программирования, который включает в себя довольно обширное моделирование методом Монте-Карло в Python и, как таковое, генерирует огромное количество случайных чисел. Почти все из них, если не все из них, смогут быть созданы с помощью встроенного в произвольный модуль Python.

Я кое-что новичок в кодировании и не знаком с эффективными и неэффективными способами. Быстрее ли генерировать слова, все случайные числа в виде списка, а затем перебирать этот список или генерировать новое случайное число каждый раз, когда вызывается функция, которая будет в очень большом цикле?

Или какой-то другой, несомненно, более умный метод?

4 Solutions collect form web for “Эффективный способ генерации и использования миллионов случайных чисел в Python”

Каждый раз генерируйте случайное число. Так как внутренняя обработка цикла касается только одного случайного числа, генерируйте и используйте его внутри цикла.

Пример:

 # do this: import random for x in xrange(SOMEVERYLARGENUMBER): n = random.randint(1,1000) # whatever your range of random numbers is # Do stuff with n # don't do this: import random # This list comprehension generates random numbers in a list numbers = [random.randint(1,1000) for x in xrange(SOMEVERYLARGENUMBER)] for n in numbers: # Do stuff with n 

Очевидно, что на практике это действительно неважно, если вы не имеете дело с миллиардами и миллиардами итераций, но зачем беспокоиться о генерации всех этих чисел, если вы собираетесь использовать только один за раз?

 import random for x in (random.randint(0,80) for x in xrange(1000*1000)): print x 

Код между скобками будет генерировать только один элемент за раз, поэтому он безопасен для памяти.

Python встроенный random модуль, например random.random() , random.randint() , (некоторые дистрибутивы также доступны, вы, вероятно, хотите gaussian) делает около 300K сэмплов / с.

Поскольку вы выполняете численное вычисление, вы, вероятно, используете numpy , что обеспечивает лучшую производительность, если вы производите произвольный массив номер один за раз, а не одно число за раз и более широкий выбор распределений. 60K / s * 1024 (длина массива), это ~ 60M сэмплов / с.

Вы также можете прочитать /dev/urandom в Linux и OSX. мой hw / sw (ноутбук osx) управляет ~ 10 МБ / с.

Разумеется, должны быть более быстрые способы генерации случайных чисел в массе, например:

 from Crypto.Cipher import AES from Crypto.Util import Counter import secrets aes = AES.new(secrets.token_bytes(16), AES.MODE_CTR, secrets.token_bytes(16), counter=Counter.new(128)) data = "0" * 2 ** 20 with open("filler.bin", "wb") as f: while True: f.write(aes.encrypt(data)) 

Это генерирует 200 Мбайт / с на одном ядре i5-4670K

Общие шифры, такие как aes и blowfish, управляют 112MB / s и 70MB / s в моем стеке. Кроме того, современные процессоры делают еще быстрее до 700 Мбайт / с, чтобы увидеть эту ссылку для тестирования нескольких аппаратных комбинаций . (изменить: ссылка сломана). Вы можете использовать более слабый режим ECB, если вы вставляете в него отдельные входы и достигаете до 3 ГБ / с.

Потоковый шифр лучше подходит для задачи, например, RC4 достигает 300 Мбайт / с на моем оборудовании, вы можете получить наилучшие результаты от самых популярных шифров, поскольку больше усилий было потрачено на оптимизацию этих программ и программного обеспечения.

Код для генерации 10 М случайных чисел эффективно и быстро:

 импортировать случайные
 л = 10000000
 listrandom = []
 для i в диапазоне (l):
     значение = random.randint (0, л)
     listrandom.append (значение)
 Распечатать listrandom

Принятое время включало время ввода-вывода, отложенное при печати на экране:

 реальный 0m27.116s
 пользователь 0m24.391s
 sys 0m0.819s
  • Создание случайных слов
  • Как создать случайное число с определенной длиной в python
  • Случайный результат случайного блуждания в python 3?
  • Создание случайных двоичных файлов
  • Python - случайная выборка из диапазона, избегая определенных значений
  • getrandbits не производит номера постоянной длины
  • Как я могу создать уникальный идентификатор в Python?
  • почему моя математическая викторина всегда печатает неправильно, когда ответ правильный
  • Python - лучший язык программирования в мире.