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

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

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

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

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

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

Время выполнения#

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

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

Шаблон аналогичен для других, более сложных генераторов. Обычная производительность устаревшего RandomState генератор значительно медленнее других, поскольку использует преобразование Бокса-Мюллера вместо метода Зиккурата. Разрыв в производительности для экспоненциальных распределений также велик из-за стоимости вычисления логарифмической функции для инвертирования CDF. Столбец с меткой 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

, и значения в

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++ Optimizing Compiler версии 19 (Visual Studio 2019). Все измерения производились на процессоре AMD Ryzen 9 3900X.