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