Spec-Zone.ru › NumPy 1.21

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

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

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

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

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

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

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

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

Целочисленные значения имеют аналогичный порядок.

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

Столбец MT19973 использует тот же 32-битный генератор, что и RandomState, но генерирует случайные величины с помощью Generator.

MT19937

PCG64

PCG64DXSM

Philox

SFC64

RandomState

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

3.3

1.9

2.0

3.3

1.8

3.1

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

5.6

3.2

2.9

4.9

2.5

5.5

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

5.9

3.1

2.9

5.0

2.6

6.0

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

13.9

10.8

10.5

12.0

8.3

56.8

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

9.1

6.0

5.8

8.1

5.4

63.9

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

37.2

30.8

28.9

34.0

27.5

77.0

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

21.3

17.4

17.6

19.3

15.6

21.4

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

73.2

72.3

76.1

73.0

72.3

82.5

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

111.7

103.4

100.5

109.4

90.7

115.2

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

MT19937

PCG64

PCG64DXSM

Philox

SFC64

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

96

162

160

96

175

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

97

171

188

113

218

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

102

192

206

121

233

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

409

526

541

471

684

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

701

1071

1101

784

1179

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

207

250

266

227

281

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

100

123

122

111

138

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

113

114

108

113

114

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

103

111

115

105

127

Общее значение

159

219

225

174

251

Примечание

Все замеры производительности были проведены под управлением Linux на процессоре AMD Ryzen 9 3900X.

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

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

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

64-битная Linux

Дистрибутив

MT19937

PCG64

PCG64DXSM

Philox

SFC64

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

100

168

166

100

182

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

100

176

193

116

224

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

100

188

202

118

228

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

100

128

132

115

167

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

100

152

157

111

168

В целом

100

161

168

112

192

64-битная Windows

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

Дистрибутив

MT19937

PCG64

PCG64DXSM

Philox

SFC64

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

100

155

131

29

150

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

100

157

143

25

154

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

100

151

144

24

155

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

100

129

128

37

150

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

100

150

145

28

159

В целом

100

148

138

28

154

32-битная Windows

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

Дистрибутив

MT19937

PCG64

PCG64DXSM

Philox

SFC64

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

100

24

34

14

57

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

100

21

32

14

74

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

100

21

34

16

73

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

100

36

57

28

101

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

100

28

44

20

88

В целом

100

25

39

18

77

Примечание

Временные характеристики Linux были получены с использованием Ubuntu 20.04 и GCC 9.3.0. Временные характеристики Windows были получены на Windows 10 с использованием оптимизирующей компилятора Microsoft C/C++ версии 19 (Visual Studio 2019). Все временные характеристики были получены на процессоре AMD Ryzen 9 3900X.

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

Spec-Zone.ru

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