Самый быстрый способ заполнить массив numpy случайными числами

Есть ли более быстрый способ получить массив numpy, заполненный случайными числами, чем встроенная функция numpy.random.rand(count)? Я знаю, что встроенный метод использует Mersenne Twister.

Я хотел бы использовать numpy для моделирования Монте-Карло, и получение случайных чисел занимает значительную часть времени. Простой пример: вычисление числа пи методом интеграции методом Монте-Карло со случайными числами 200E6 обрабатывает только около 116,8 МБ/с через мою программу. Сопоставимая программа, написанная на C++ с использованием xor128(), так как генератор обрабатывает несколько сотен МБ/с.

РЕДАКТИРОВАТЬ: Неправильный расчет скорости генерации


person chew socks    schedule 07.11.2013    source источник
comment
генерировать в файл и загружать оттуда? не лучший, но, вероятно, самый простой.   -  person Adam    schedule 07.11.2013
comment
Если ничего не помогает, вы всегда можете написать свою собственную функцию случайного заполнения на C или C++: docs.scipy.org/doc/numpy/user/c-info.how-to-extend.html   -  person Adam    schedule 07.11.2013
comment
@Adam Проблема в том, что у меня было достаточно продолжительное моделирование, чтобы обработать сотни терабайт данных.   -  person chew socks    schedule 07.11.2013
comment
Вы синхронизируете всю симуляцию или только генерацию случайных чисел? (Если вы синхронизируете генерацию случайных чисел, обе программы производят весь массив чисел или код C++ отбрасывает каждое число перед созданием следующего?)   -  person user2357112 supports Monica    schedule 07.11.2013
comment
@user2357112 user2357112 Я измеряю время всей симуляции, но из cProfile вижу, что функция random.rand занимает много времени. Код C++ буферизует около 10000 чисел за раз. Программа python работает с полноразмерными массивами.   -  person chew socks    schedule 07.11.2013
comment
Добавляя цикл в программу python, чтобы каждый массив numpy был меньше, увеличивал скорость. Теперь они вполне сопоставимы: python = 4,2 секунды, C++ = 3,38 секунды. Оба сейчас работают со скоростью несколько сотен МБ/с.   -  person chew socks    schedule 07.11.2013


Ответы (1)


Возможно, вы могли бы получить небольшое увеличение производительности за счет снижения точности - если это приемлемо. Я сделал это, используя randint и масштабирование:

Использование ипитона %%timeit

count =1000

numpy.random.rand(count)

10000 loops, best of 3: 24.3us per loop

numpy.random.randint(0,1000,count)*0.001

10000 loops, best of 3: 21.4us per loop
person atomh33ls    schedule 07.11.2013