Spec-Zone.ru › NumPy 2.0

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

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

Рекомендуемый генератор для общего использования — 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–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/random/performance.html

Spec-Zone.ru

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