Производительность
Рекомендации
Рекомендуемым генератором для общего использования является PCG64. Он обладает высокой статистической достоверностью, полным функционалом и быстрой работой на большинстве платформ, но немного медленнее при компиляции для 32-битных процессов.
Philox довольно медленный, но его статистические свойства имеют очень высокую достоверность, и легко получить гарантированно независимые потоки, используя уникальные ключи. Если вам нужен такой стиль для параллельных потоков или вы портируете систему, использующую этот стиль, то Philox — ваш выбор.
SFC64 обладает высокой статистической достоверностью и очень быстрый. Однако он не поддерживает возможность перехода к другому значению. Если вам эта возможность не нужна, а нужна высокая скорость, даже на 32-битных процессах, это ваш выбор.
MT19937 не проходит некоторые статистические тесты и не является особенно быстрым по сравнению с современными генераторами псевдослучайных чисел (ПСПЧ). По этим причинам мы в основном не рекомендуем использовать его самостоятельно, только через устаревшую реализацию RandomState для воспроизведения старых результатов. Тем не менее, он имеет богатую историю в качестве по умолчанию во многих системах.
Время выполнения
Значения времени ниже — это время в нс, необходимое для генерации одного случайного значения из конкретного распределения. Исходный генератор MT19937 значительно медленнее, так как ему требуется 2 32-битных значения для получения результата, аналогичного более быстрым генераторам.
Производительность для целых чисел имеет аналогичный порядок.
Аналогичный узор наблюдается для других, более сложных генераторов. Нормальная производительность устаревшего генератора RandomState значительно ниже по сравнению с другими, так как он использует преобразование Бокса—Мюллера вместо генератора Зиггурата. Разрыв в производительности для экспоненциальных распределений также значителен из-за затрат на вычисление логарифмической функции для инвертирования функции распределения. Столбец MT19973 использует тот же 32-битный генератор, что и RandomState, но генерирует случайные значения с использованием Generator.
| MT19937 | PCG64 | Philox | SFC64 | RandomState | |
|---|---|---|---|---|---|
| 32-битные беззнаковые целые | 3.2 | 2.7 | 4.9 | 2.7 | 3.2 |
| 64-битные беззнаковые целые | 5.6 | 3.7 | 6.3 | 2.9 | 5.7 |
| Равномерное распределение | 7.3 | 4.1 | 8.1 | 3.1 | 7.3 |
| Нормальное распределение | 13.1 | 10.2 | 13.5 | 7.8 | 34.6 |
| Экспоненциальное распределение | 7.9 | 5.4 | 8.5 | 4.1 | 40.3 |
| Гамма-распределение | 34.8 | 28.0 | 34.7 | 25.1 | 58.1 |
| Биномиальное распределение | 25.0 | 21.4 | 26.1 | 19.5 | 25.2 |
| Распределение Лапласа | 45.1 | 40.7 | 45.5 | 38.1 | 45.6 |
| Распределение Пуассона | 67.6 | 52.4 | 69.2 | 46.4 | 78.1 |
Следующая таблица представляет производительность в процентах относительно значений, сгенерированных устаревшим генератором, RandomState(MT19937()). Общая производительность была рассчитана с использованием геометрической средней.
| MT19937 | PCG64 | Philox | SFC64 | |
|---|---|---|---|---|
| 32-битные беззнаковые целые | 101 | 121 | 67 | 121 |
| 64-битные беззнаковые целые | 102 | 156 | 91 | 199 |
| Равномерное распределение | 100 | 179 | 90 | 235 |
| Нормальное распределение | 263 | 338 | 257 | 443 |
| Экспоненциальное распределение | 507 | 752 | 474 | 985 |
| Гамма-распределение | 167 | 207 | 167 | 231 |
| Биномиальное распределение | 101 | 118 | 96 | 129 |
| Распределение Лапласа | 101 | 112 | 100 | 120 |
| Распределение Пуассона | 116 | 149 | 113 | 168 |
| Общее | 144 | 192 | 132 | 225 |
Примечание
Все замеры производительности были выполнены под Linux на процессоре i5-3570.
Производительность на разных операционных системах
Производительность отличается на разных платформах из-за различий в компиляторах и доступном оборудовании (например, ширине регистров). По умолчанию генератор битов был выбран для хорошей производительности на 64-битных платформах. Производительность на 32-битных операционных системах сильно отличается.
Указанные значения нормированы относительно скорости MT19937 в каждой таблице. Значение 100 указывает, что производительность соответствует MT19937. Более высокие значения указывают на улучшенную производительность. Эти значения нельзя сравнивать между таблицами.
64-битный Linux
| Дистрибутив | MT19937 | PCG64 | Philox | SFC64 |
|---|---|---|---|---|
| 32-битное беззнаковое целое | 100 | 119,8 | 67,7 | 120,2 |
| 64-битное беззнаковое целое | 100 | 152,9 | 90,8 | 213,3 |
| Равномерное распределение | 100 | 179,0 | 87,0 | 232,0 |
| Нормальное распределение | 100 | 128,5 | 99,2 | 167,8 |
| Экспоненциальное распределение | 100 | 148,3 | 93,0 | 189,3 |
| В целом | 100 | 144,3 | 86,8 | 180,0 |
64-битный Windows
Относительная производительность на 64-битном Linux и 64-битном Windows в целом схожа.
| Дистрибутив | MT19937 | PCG64 | Philox | SFC64 |
|---|---|---|---|---|
| 32-битное беззнаковое целое | 100 | 129,1 | 35,0 | 135,0 |
| 64-битное беззнаковое целое | 100 | 146,9 | 35,7 | 176,5 |
| Равномерное распределение | 100 | 165,0 | 37,0 | 192,0 |
| Нормальное распределение | 100 | 128,5 | 48,5 | 158,0 |
| Экспоненциальное распределение | 100 | 151,6 | 39,0 | 172,8 |
| В целом | 100 | 143,6 | 38,7 | 165,7 |
32-битный Windows
Производительность 64-битных генераторов на 32-битном Windows значительно ниже, чем на 64-битных операционных системах из-за ширины регистров. MT19937, генератор, который используется в NumPy с 2005 года, работает с 32-битными целыми числами.
| Дистрибутив | MT19937 | PCG64 | Philox | SFC64 |
|---|---|---|---|---|
| 32-битное беззнаковое целое | 100 | 30,5 | 21,1 | 77,9 |
| 64-битное беззнаковое целое | 100 | 26,3 | 19,2 | 97,0 |
| Равномерное распределение | 100 | 28,0 | 23,0 | 106,0 |
| Нормальное распределение | 100 | 40,1 | 31,3 | 112,6 |
| Экспоненциальное распределение | 100 | 33,7 | 26,3 | 109,8 |
| В целом | 100 | 31,4 | 23,8 | 99,8 |
Примечание
Измерения времени для Linux использовали Ubuntu 18.04 и GCC 7.4. Измерения времени для Windows были проведены на Windows 10 с использованием Microsoft C/C++ Optimizing Compiler версии 19 (Visual Studio 2015). Все измерения были получены на процессоре i5-3570.
© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.17.0/reference/random/performance.html