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