Spec-Zone.ru › NumPy 1.18

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

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

Рекомендуемым генератором для общего использования является 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–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.18/reference/random/performance.html

Spec-Zone.ru

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