效能#
建議#
一般用途的建議生成器是 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 處理器上產生。