性能#

推荐#

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

Philox 速度相当慢,但其统计特性具有很高的质量,并且可以通过使用唯一的键轻松获得可确保独立的流。如果这是您希望用于并行流的样式,或者您是从使用该样式的另一个系统移植过来的,那么 Philox 是您的选择。

SFC64 具有很高的统计质量且速度很快。但是,它缺乏跳转能力。如果您没有使用该功能并且想要更高的速度,即使在 32 位进程上也是如此,那么这是您的选择。

MT19937 未能通过一些统计测试,并且与现代 PRNG 相比速度并不快。由于这些原因,我们通常不建议单独使用它,仅通过旧版 RandomState 来重现旧的结果。也就是说,它作为许多系统中的默认值拥有非常悠久的历史。

计时#

下面的计时是以纳秒为单位的时间,用于从特定分布中产生 1 个随机值。原始的 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

正态分布

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++ Optimizing Compiler 版本 19(Visual Studio 2019)进行的。所有计时均在 AMD Ryzen 9 3900X 处理器上生成。