Производительность
Рекомендации
Рекомендуемый генератор для общего использования — 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++ версии 19 (Visual Studio 2015). Все замеры производительности выполнены на процессоре i5-3570.
© 2005–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/random/performance.html