性能#
推荐#
推荐用于一般用途的生成器是 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处理器上生成的.