Производительность
Рекомендация
Рекомендуемый генератор для общего использования — PCG64. Он обладает высоким статистическим качеством, полным функционалом и высокой скоростью на большинстве платформ, но несколько медленнее при компиляции для 32-разрядных процессов.
Philox довольно медленный, но его статистические свойства обладают очень высоким качеством, и легко получить гарантированно независимые потоки, используя уникальные ключи. Если это стиль, который вы хотите использовать для параллельных потоков, или вы переносите из другой системы, которая использует этот стиль, тогда Philox — ваш выбор.
SFC64 обладает высоким статистическим качеством и очень высокой скоростью. Однако ему не хватает возможности прыжков. Если вы не используете эту возможность и хотите высокой скорости, даже на 32-разрядных процессах, это ваш выбор.
MT19937 не проходит некоторые статистические тесты и не особенно быстрый по сравнению с современными PRNG. По этим причинам мы в основном не рекомендуем использовать его самостоятельно, только через устаревший RandomState для воспроизведения старых результатов. Тем не менее, он имеет очень долгую историю в качестве значения по умолчанию во многих системах.
Замеры времени
Приведенные ниже замеры времени показывают время в нс для генерации 1 случайного значения из определенного распределения. Оригинальный генератор 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–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/reference/random/performance.html