Spec-Zone.ru › NumPy 1.19

Производительность

Рекомендация

Рекомендуемый генератор для общего использования — PCG64. Он обладает высоким статистическим качеством, полным функционалом и высокой скоростью на большинстве платформ, но несколько медленнее при компиляции для 32-разрядных процессов.

Philox довольно медленный, но его статистические свойства обладают очень высоким качеством, и легко получить гарантированно независимые потоки, используя уникальные ключи. Если это стиль, который вы хотите использовать для параллельных потоков, или вы переносите из другой системы, которая использует этот стиль, тогда Philox — ваш выбор.

SFC64 обладает высоким статистическим качеством и очень высокой скоростью. Однако ему не хватает возможности прыжков. Если вы не используете эту возможность и хотите высокой скорости, даже на 32-разрядных процессах, это ваш выбор.

MT19937 не проходит некоторые статистические тесты и не особенно быстрый по сравнению с современными PRNG. По этим причинам мы в основном не рекомендуем использовать его самостоятельно, только через устаревший RandomState для воспроизведения старых результатов. Тем не менее, он имеет очень долгую историю в качестве значения по умолчанию во многих системах.

Замеры времени

Приведенные ниже замеры времени показывают время в нс для генерации 1 случайного значения из определенного распределения. Оригинальный генератор MT19937 намного медленнее, поскольку ему требуется 2 32-битных значения для получения результата, эквивалентного выводу более быстрых генераторов.

Производительность для целых чисел имеет аналогичный порядок.

Аналогичная картина наблюдается и для других, более сложных генераторов. Производительность устаревшего генератора RandomState намного ниже, чем у других, поскольку он использует преобразование Бокса-Мюллера, а не генератор Зиггурата. Разрыв в производительности для экспоненциальных распределений также велик из-за стоимости вычисления логарифмической функции для обращения функции распределения. Столбец с меткой MT19973 использует тот же 32-битный генератор, что и RandomState, но генерирует случайные значения с использованием Generator.

MT19937

PCG64

Philox

SFC64

RandomState

32-битные беззнаковые целые числа

3.2

2.7

4.9

2.7

3.2

64-битные беззнаковые целые числа

5.6

3.7

6.3

2.9

5.7

Равномерные

7.3

4.1

8.1

3.1

7.3

Нормальные

13.1

10.2

13.5

7.8

34.6

Экспоненциальные

7.9

5.4

8.5

4.1

40.3

Гамма-распределения

34.8

28.0

34.7

25.1

58.1

Биномиальные

25.0

21.4

26.1

19.5

25.2

Лапласа

45.1

40.7

45.5

38.1

45.6

Пуассона

67.6

52.4

69.2

46.4

78.1

Следующая таблица показывает производительность в процентах относительно значений, сгенерированных устаревшим генератором, RandomState(MT19937()). Общая производительность вычислялась с использованием геометрического среднего.

MT19937

PCG64

Philox

SFC64

32-битные беззнаковые целые числа

101

121

67

121

64-битные беззнаковые целые числа

102

156

91

199

Равномерные распределения

100

179

90

235

Нормальные распределения

263

338

257

443

Экспоненциальные распределения

507

752

474

985

Гамма-распределения

167

207

167

231

Биномиальные распределения

101

118

96

129

Распределения Лапласа

101

112

100

120

Распределения Пуассона

116

149

113

168

Общее время

144

192

132

225

Примечание

Все замеры времени были выполнены на Linux на процессоре i5-3570.

Производительность на разных операционных системах

Производительность различается на разных платформах из-за различий в компиляторах и доступности аппаратных средств (например, разрядности регистров). Генератор по умолчанию был выбран для обеспечения высокой производительности на 64-битных платформах. Производительность на 32-битных операционных системах существенно отличается.

Приведенные значения нормализованы относительно скорости MT19937 в каждой таблице. Значение 100 указывает, что производительность соответствует MT19937. Более высокие значения указывают на повышение производительности. Эти значения не могут сравниваться между таблицами.

64-битная Linux

Дистрибутив

MT19937

PCG64

Philox

SFC64

32-битное беззнаковое целое число

100

119.8

67.7

120.2

64-битное беззнаковое целое число

100

152.9

90.8

213.3

Равномерные распределения

100

179.0

87.0

232.0

Нормальные распределения

100

128.5

99.2

167.8

Экспоненциальные распределения

100

148.3

93.0

189.3

Общее время

100

144.3

86.8

180.0

64-битная Windows

Относительная производительность на 64-битной Linux и 64-битной Windows в целом схожа.

Дистрибутив

MT19937

PCG64

Philox

SFC64

32-битное беззнаковое целое число

100

129.1

35.0

135.0

64-битное беззнаковое целое число

100

146.9

35.7

176.5

Равномерные распределения

100

165.0

37.0

192.0

Нормальные распределения

100

128.5

48.5

158.0

Экспоненциальные распределения

100

151.6

39.0

172.8

Общее время

100

143.6

38.7

165.7

32-битная Windows

Производительность 64-битных генераторов на 32-битной Windows значительно ниже, чем на 64-битных операционных системах из-за разрядности регистров. MT19937, генератор, который используется в NumPy с 2005 года, работает с 32-битными целыми числами.

Дистрибутив

MT19937

PCG64

Philox

SFC64

32-битное беззнаковое целое число

100

30.5

21.1

77.9

64-битное беззнаковое целое число

100

26.3

19.2

97.0

Равномерные распределения

100

28.0

23.0

106.0

Нормальные распределения

100

40.1

31.3

112.6

Экспоненциальные распределения

100

33.7

26.3

109.8

Общее время

100

31.4

23.8

99.8

Примечание

Для замеров времени на Linux использовались Ubuntu 18.04 и GCC 7.4. Замеры времени на Windows были выполнены на Windows 10 с использованием Microsoft C/C++ Optimizing Compiler версии 19 (Visual Studio 2015). Все замеры времени были выполнены на процессоре i5-3570.

END_OF_DOCUMENT_MARKER

© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/reference/random/performance.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API