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

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

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

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

  • Получить случайное логическое значение в python?
  • Выберите случайный элемент с весом
  • Создание списка случайных чисел, суммирование до 1
  • Как выбрать случайное английское слово из списка
  • Как прорежировать через dict в случайном порядке в Python?
  • random.sample () каждый раз возвращает одну и ту же случайную последовательность?
  • Генератор случайных чисел, как получить случайные числа, которые не совпадают
  • Как создать случайное число с определенной длиной в 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
    
    Interesting Posts

    Как установить старую формулу с помощью Brew?

    Изменение User Agent в Python 3 для urrlib.request.urlopen

    Вычислительный продукт i-й строки массива1 и i-й столбец array2 – NumPy

    Подгонка кривой 6-й степени с помощью numpy / scipy

    Манипулирование двоичными данными в Python

    Способ «прослушать» изменения в файловой системе из Python в Linux?

    Что делает hash в python?

    Как определить, сжат ли файл gzip?

    Как использовать m2crypto для проверки цепочки сертификатов X509 в настройке без SSL

    Как изменить интерпретатор Python, который использует gdb?

    MatLab (или любой другой язык) для преобразования матрицы или csv для размещения значений второго столбца в одну строку, если значение 1-го столбца одинаково?

    Scikit-Learn: метка не x присутствует во всех примерах обучения

    OSError – Errno 13 Разрешение отклонено

    Добавить строку в определенной позиции в Python

    Должны ли операторы импорта Python всегда находиться в верхней части модуля?

    Python - лучший язык программирования в мире.