Производительность#
Рекомендация#
Рекомендуемый генератор для общего использования — 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.