性能#

推荐#

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

Philox 相当慢,但是它的统计特性具有非常高的质量,并且通过使用唯一的密钥很容易获得有保证的独立流.如果这是您希望用于并行流的样式,或者您是从使用该样式的另一个系统移植过来的,那么 Philox 是您的选择.

SFC64 在统计上具有高质量,并且非常快.但是,它缺乏可跳跃性.如果您不使用该功能并且想要很高的速度,即使在 32 位进程上也是如此,那么这是您的选择.

MT19937 fails some statistical tests ,并且与现代PRNG相比,速度也不是特别快.由于这些原因,我们主要不建议单独使用它,仅通过遗留的 RandomState 重现旧的结果. 也就是说,它作为许多系统中的默认设置有着悠久的历史.

计时#

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

整数性能具有相似的排序.

对于其他更复杂的生成器,模式是相似的.遗留的 RandomState 生成器的正常性能远低于其他生成器,因为它使用Box-Muller变换而不是Ziggurat方法. 由于计算log函数以反转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

正态分布

13.9

10.8

10.5

12.0

8.3

56.8

指数分布

9.1

6.0

5.8

8.1

5.4

63.9

伽马分布

37.2

30.8

28.9

34.0

27.5

77.0

二项分布

21.3

17.4

17.6

19.3

15.6

21.4

拉普拉斯分布

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

正态分布

409

526

541

471

684

指数分布

701

1071

1101

784

1179

伽马分布

207

250

266

227

281

二项分布

100

123

122

111

138

拉普拉斯分布

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#

分布

MT19937

PCG64

PCG64DXSM

Philox

SFC64

32位无符号整数

100

168

166

100

182

64位无符号整数

100

176

193

116

224

均匀分布

100

188

202

118

228

正态分布

100

128

132

115

167

指数分布

100

152

157

111

168

总体

100

161

168

112

192

64位 Windows#

64位Linux和64位Windows上的相对性能大致相似,但Philox生成器除外.

分布

MT19937

PCG64

PCG64DXSM

Philox

SFC64

32位无符号整数

100

155

131

29

150

64位无符号整数

100

157

143

25

154

均匀分布

100

151

144

24

155

正态分布

100

129

128

37

150

指数分布

100

150

145

28

159

总体

100

148

138

28

154

32位 Windows#

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

分布

MT19937

PCG64

PCG64DXSM

Philox

SFC64

32位无符号整数

100

24

34

14

57

64位无符号整数

100

21

32

14

74

均匀分布

100

21

34

16

73

正态分布

100

36

57

28

101

指数分布

100

28

44

20

88

总体

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处理器上生成的.