效能#

建議#

一般用途的建議生成器是 PCG64,或是其升級變體 PCG64DXSM,適用於高度平行使用情境。它們在統計學上品質優良、功能齊全,且在大多數平台上速度很快,但編譯為 32 位元程序時速度稍慢。有關高度平行處理何時表示應使用 PCG64DXSM 的詳細資訊,請參閱 使用 PCG64DXSM 升級 PCG64

Philox 速度相當慢,但其統計特性品質非常高,且透過使用唯一金鑰,很容易獲得確定獨立的流。如果這是您希望用於平行流的樣式,或者您是從另一個使用該樣式的系統移植,那麼 Philox 是您的選擇。

SFC64 在統計學上品質優良且速度非常快。然而,它缺乏跳躍性。如果您不使用該功能並且想要高速,即使在 32 位元程序上也是如此,那麼這是您的選擇。

MT19937 在某些統計測試中失敗,並且與現代 PRNG 相比速度不是特別快。基於這些原因,我們基本上不建議單獨使用它,僅透過舊版 RandomState 來重現舊結果。儘管如此,它在許多系統中作為預設值有著非常悠久的歷史。

計時#

以下計時是以奈秒 (ns) 為單位,表示從特定分佈產生 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

注意

所有計時均在 Linux 上使用 AMD Ryzen 9 3900X 處理器進行。

不同作業系統上的效能#

由於編譯器和硬體可用性(例如,暫存器寬度)的差異,效能在不同平台之間有所不同。預設的位元生成器已選擇在 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 Version 19 (Visual Studio 2019) 進行的。所有計時均在 AMD Ryzen 9 3900X 處理器上產生。