Spec-Zone.ru › NumPy 1.17

Производительность

Рекомендации

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API