性能#

推荐#

推荐的一般用途生成器是 PCG64 或其升级变体 PCG64DXSM 用于高度并行使用场景.它们在大多数平台上统计质量高、功能齐全且速度快,但在编译为32位进程时速度较慢.有关何时使用 PCG64DXSM 的详细信息,请参见 使用 PCG64DXSM 升级 PCG64.

Philox 相当慢,但其统计属性具有非常高的质量,并且通过使用唯一的键可以轻松获得可保证独立的流.如果这是您希望用于并行流的样式,或者您正在从使用该样式的其他系统移植,那么 Philox 是您的选择.

SFC64 在统计上质量高且速度非常快.然而,它缺乏跳跃性.如果你不使用该功能并且想要大量的速度,即使在32位进程中,这也是你的选择.

MT19937 未能通过一些统计测试 ,并且与现代PRNG相比并不是特别快.出于这些原因,我们大多不推荐单独使用它,只能通过旧版的 RandomState 来重现旧的结果.尽管如此,它在许多系统中作为默认设置有着非常悠久的历史.

时间#

以下时间是生成一个特定分布的随机值所需的时间(单位:纳秒).原始的 MT19937 生成器要慢得多,因为它需要 2 个 32 位值才能等于更快的生成器的输出.

整数性能有类似的排序.

对于其他更复杂的生成器,模式是相似的.传统的 RandomState 生成器的正常性能要比其他的低得多,因为它使用的是 Box-Muller 变换而不是 Ziggurat 方法.由于计算对数函数以反转 CDF 的成本,指数的性能差距也很大.标记为 MT19973 的列使用与 RandomState 相同的 32 位生成器,但使用 Generator 生成随机变量.

MT19937

PCG64

PCG64DXSM

Philox

SFC64

RandomState

32位无符号整数

3.3

1.9

2.0

3.3

1.8

3.1

64位无符号整数

5.6

3.2

2.9

4.9

2.5

5.5

制服

5.9

3.1

2.9

5.0

2.6

6.0

Normals

13.9

10.8

10.5

12.0

8.3

56.8

指数

9.1

6.0

5.8

8.1

5.4

63.9

Gammas

37.2

30.8

28.9

34.0

27.5

77.0

二项式

21.3

17.4

17.6

19.3

15.6

21.4

Laplaces

73.2

72.3

76.1

73.0

72.3

82.5

泊松

111.7

103.4

100.5

109.4

90.7

115.2

下表展示了相对于旧版生成器 RandomState(MT19937()) 生成的值的性能百分比.总体性能是使用几何平均值计算的.

MT19937

PCG64

PCG64DXSM

Philox

SFC64

32位无符号整数

96

162

160

96

175

64位无符号整数

97

171

188

113

218

制服

102

192

206

121

233

Normals

409

526

541

471

684

指数

701

1071

1101

784

1179

Gammas

207

250

266

227

281

二项式

100

123

122

111

138

Laplaces

113

114

108

113

114

泊松

103

111

115

105

127

总体

159

219

225

174

251

备注

所有时间都是在AMD Ryzen 9 3900X处理器上使用Linux测得的.

不同操作系统上的性能#

由于编译器和硬件可用性(例如,寄存器宽度)的差异,不同平台上的性能有所不同.默认的位生成器已被选择在64位平台上表现良好.在32位操作系统上的性能非常不同.

报告的值相对于每个表中的 MT19937 速度进行了归一化.值为 100 表示性能与 MT19937 匹配.更高的值表示性能提升.这些值不能在不同表之间进行比较.

64位 Linux#

Distribution

MT19937

PCG64

PCG64DXSM

Philox

SFC64

32位无符号整数

100

168

166

100

182

64位无符号整数

100

176

193

116

224

制服

100

188

202

118

228

Normals

100

128

132

115

167

指数

100

152

157

111

168

总体

100

161

168

112

192

64位 Windows#

在64位Linux和64位Windows上的相对性能大致相似,值得注意的是Philox生成器除外.

Distribution

MT19937

PCG64

PCG64DXSM

Philox

SFC64

32位无符号整数

100

155

131

29

150

64位无符号整数

100

157

143

25

154

制服

100

151

144

24

155

Normals

100

129

128

37

150

指数

100

150

145

28

159

Overall

100

148

138

28

154

32位 Windows#

在32位Windows上的64位生成器的性能远低于在64位操作系统上的性能,这是由于寄存器宽度的原因.自2005年以来在NumPy中的MT19937生成器,操作在32位整数上.

Distribution

MT19937

PCG64

PCG64DXSM

Philox

SFC64

32位无符号整数

100

24

34

14

57

64位无符号整数

100

21

32

14

74

制服

100

21

34

16

73

Normals

100

36

57

28

101

指数

100

28

44

20

88

Overall

100

25

39

18

77

备注

Linux 时间使用的是 Ubuntu 20.04 和 GCC 9.3.0.Windows 时间是在 Windows 10 上使用 Microsoft C/C++ 优化编译器版本 19(Visual Studio 2019)进行的.所有时间都是在 AMD Ryzen 9 3900X 处理器上生成的.