This repository was archived by the owner on Mar 24, 2026. It is now read-only.
Repository navigation
Expand file tree
/
Copy pathrng.py
More file actions
97 lines (73 loc) · 2.97 KB
/
Copy pathrng.py
File metadata and controls
97 lines (73 loc) · 2.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# Copyright (C) 2018 Intel Corporation
#
# SPDX-License-Identifier: MIT
import numpy as np
import timeit
import sys
def sample_uniform(rs, sz):
rs.uniform(-1, 1, size=sz)
def sample_normal(rs, sz):
rs.standard_normal(size=sz)
def sample_gamma(rs, sz):
rs.gamma(5.2, 1, size=sz)
def sample_beta(rs, sz):
rs.beta(0.7, 2.5, size=sz)
def sample_randint(rs, sz):
if hasattr(rs, 'randint'):
rs.randint(0, 100, size=sz, dtype=np.intc)
elif hasattr(rs, 'integers'):
rs.integers(0, 100, size=sz, dtype=np.intc)
else:
raise RuntimeError
def sample_poisson(rs, sz):
rs.poisson(7.6, size=sz)
def sample_hypergeom(rs, sz):
rs.hypergeometric(214, 97, 83, size=sz)
OUTER_REPS=6
INNER_REPS=512
SEED=123
def main():
import itertools
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--prefix', required=False, default="IntelPython", help="Print with each result")
parser.add_argument('--impl', required=False, default="mkl_random", choices=['mkl_random', 'numpy'], help='RNG implementation\n'
'choices:\n'
'mkl_random: mkl_random.RandomState to be used\n'
'numpy: numpy.Generator to be used')
args = parser.parse_args()
if args.impl == 'mkl_random':
try:
import mkl_random as rnd
mkl = True
except (ImportError, ModuleNotFoundError) as e:
print(str(e))
print('mkl_random is chosen for benchmark, however it is not found in current environemnt')
sys.exit(1)
else:
import numpy.random as rnd
mkl = False
if mkl:
brngs = ['WH', 'PHILOX4X32X10', 'MT2203', 'MCG59', 'MCG31', 'MT19937', 'MRG32K3A', 'SFMT19937', 'R250']
else:
brngs = [np.random.MT19937, np.random.Philox]
samplers = {'uniform': sample_uniform, 'normal': sample_normal, 'gamma': sample_gamma, 'beta': sample_beta,
'randint': sample_randint, 'poisson': sample_poisson, 'hypergeom': sample_hypergeom}
multipliers = {'uniform': 10, 'normal': 2, 'gamma': 1, 'beta': 1, 'randint': 10, 'poisson': 5, 'hypergeom': 1}
for brng_name, sfn in itertools.product(brngs, samplers.keys()):
func = samplers[sfn]
m = multipliers[sfn]
times_list = []
for __ in range(OUTER_REPS):
if mkl:
rs = rnd.RandomState(SEED, brng=brng_name)
else:
rs = rnd.Generator(brng_name(seed=SEED))
t0 = timeit.default_timer()
for __ in range(INNER_REPS):
func(rs, (m*100, 1000))
t1 = timeit.default_timer()
times_list.append(t1-t0)
print(f"{args.prefix},{m*100*1000},{brng_name if mkl else brng_name().__class__.__name__},{sfn},{min(times_list):.5f}")
if __name__ == '__main__':
main()